Wpis z mikrobloga

Mam taki drobny problem. Zadanie na uczelni.

losowanie –funkcja:
- pobiera jako argument liczbę N struktur, które mają zostać utworzone;
- dynamicznie alokuje pamięć na tablicę N wskaźników na struktury;
- następnie alokuje kolejno N struktur, przypisując uzyskane adresy do kolejnych komórek utworzonej wcześniej tablicy;

Jest ktoś w stanie jakoś po ludzku wytłumaczyć mi o so w tym chosi? Nie chcę tu gotowego kodu, ale chociaż wytłumaczenia zasady działania i podania ewentualnych dodatkowych źródeł. Jesteście moją ostatnią deską ratunku. Uratujcie biednego studenta...
#naukaprogramowania
  • 21
@alfabeta11: funkcja na przyjąć inta N, utworzyć (zaalokować) tablicę o wielkości N pointerów na struktury, a następnie utworzyć N struktur i wypełnić wcześniej utworzoną tablicę pointerami na utworzone struktury.
Czyli bardziej metaforycznie - weź N, zrób listę N adresów (na razie pusta książka adresowa), potem wybuduj N domów i wypełnij książkę adresami tych domów :)
@alfabeta11: jeśli coś C-podobne to chodzi o to, żeby zrobić

???? funkcja(int N) { /* tu kod */ }
Która tworzy dynamiczną tablicę N-elementową, której elementami są wskaźniki na jakiś typ struktur. Następnie każdy element tablicy ma być wypełniony dynamicznie stworzoną (każda różną) strukturą.

Ot coś w stylu

typ_struktury** tablica = new typ_struktury*[N];
for(...) { tablica[i] = new typ_struktury(); }
@kao3991: Czyli coś w stylu, że na żywca tworzę sobie tablicę struktur za pomocą tego nieszczęsnego malloc, potem kiedy mam już np structtab[i], mam zrobić coś w stylu structtab[i] = malloc i znowu alokowac rozmiar sturktury?
Wszystko to na pojedynczym "*"?
Samego adresu nie można by przechowywać w jakiejś zmiennej typu string czy coś w ten deseń?


@alfabeta11: Byłoby to karkołomne ( ͡° ͜ʖ ͡°) Po 1. po to są wskaźniki, aby trzymać w nich adres. Język udostępnia narzędzia manipulacji na wskaźnikach (takie jak właśnie typy wskaźnikowe, operatory dereferencji wskaźników etc). Poza tym taki wskaźnik ma stały rozmiar i przechowuje się w nim wartość liczbowa. Jakbyś chciał trzymać
I pojawia się kolejne pytanie, po co wskazywać na wskaźnik?

Samego adresu nie można by przechowywać w jakiejś zmiennej typu string czy coś w ten deseń?


@alfabeta11:
W C stringi to tablice znaków, a w czymś takim jak tablica[n] tablica jest wskaźnikiem na pierwszy element. W związku z tym często spotyka się zapis char** argv, co należy rozumieć jako tablica stringów.
@nieztejziemi: @NostalgicznyPasterz: Bardzo wam dziękuję za dosyć obszerne wyjaśnienia. Prawie wszystkie moje wątpliwości chyba zostały rozwiane. Mówię chyba, bo temat wskaźników sam w sobie jest dosyć straszny ;)

Zostaje tylko jedna sprawa. Kedy robię malloc([...] sizeof(struct type*)) to alokuje się ilość pamięci o rozmiarze samego adresu, czy raczej o rozmiarze całej struktury?
@alfabeta11: Napisałem Ci mały przykład: https://ideone.com/8dWv6L
1) rozmiar struktury to 20 bajtow (zalezny od zawartosci struktury)
2) rozmiar wskaznika na strukture to 4 bajty (rozmiar staly, niezaleznie od typu ktory przechowuje - w koncu adres to adres, niezaleznie na co wskazuje)
3) powolalismy tablice struktur, tablica jest reprezentowana jako adres pierwszego elementu. Poniewaz jest to adres, to sizeof zwraca 4 bajty. Zostal zaalokowany blok 200 bajtow na 10 struktur tt.
4)