Zamień struct s { int i; } s;
na
struct s_t { int i; } s;
to zobaczysz dlaczego.
Zmieniłem; otrzymuję m.in. taki komunikat:
error: ‘struct s’ has no member named ‘i’
To naprowadza mnie na pomysł, że definicja struktury s
(końcowe s
) nie jest do niczego w tym przykładowym programie potrzebna. Nie wiem, czemu ją tam umieściłem. :) <zastanawia się>
Nadal jednak nie widzę rozwiązania problemu.
- używasz wskaźników do struktur stosowych - da się przeżyć
Wydaje mi się, że nie ma to związku z działaniem programu (bo "da się przeżyć" ;) ); ale z drugiej strony wydaje mi się, że trafna uwaga. Pewnie będę jeszcze w przyszłości o tym czytać.
- ale każdy wskaźnik wskazuje na tę samą strukturę - błąd
- ponieważ przy tym nazewnictwie nie wiesz co jest zmienną a co typem.
Tak, to prawda, odniosłem się do tego wyżej. Ale nie rozumiem: tę samą strukturę?
Moja sugestia: zamień tablicę na nie-wskaźnikową lub alokuj struktury przed użyciem (malloc/calloc).
Co do tablicy struktur – wiem, że działa tak, jak oczekuję; odpowiadające wartości wypisywane w obu pętlach są takie same. Chciałbym właśnie zobaczyć, czy można – a jeśli tak, to jak – uzyskać to samo działanie dla tablicy wskaźników na struktury.
Jeśli chodzi o korzystanie z malloc
: pewnie będę jeszcze w przyszłości próbować. Póki co chciałbym uczynić powyższy program działającym za pomocą minimalnych zmian.
Skompiluj z -fsanitize=address
to zobaczysz co się dzieje.
Patrzę właśnie na stronę podrzuconą przez @MarekR22 , ale niewiele rozumiem. ;) Może kiedyś zrozumiem.
@vpiotr pomijasz imho najważniejszą przyczynę błędu: arr[n] = &(struct s){ .i = n };
@Silv to co zrobiłeś tutaj to:
a. stworzenie zmiennej automatycznej typu struct s
w postaci tzw. compound literal (struct s){ .i = n }
(OK)
b. wzięcie jej adresu i wpisanie do arr[n]
, tj. arr[n] = &(...
(nadal OK)
c. zmienna jest niszczona, ale jej adres zostaje w tablicy no i jest problem, tzn. UB ;)
Mam w głowie, że undefined behavior oznacza "każdy błąd jest uzasadniony". ;) Tutaj wolałbym wiedzieć więcej niż to, że to, że jest źle, jest oczekiwane. Zmienna jest "automatyczna"… A więc byłoby, że jest związana z tzw. "automatic storage duration" (w przeciwieństwie do tzw. "allocated storage duration"; https://en.cppreference.com/w/c/language/storage_class_specifiers), czy tak? Muszę o tym poczytać, bo na razie nie wiem, jakie wnioski wyciągać. (Dlaczegóż każde źródło w internecie pisze w innych słowach to samo! (Zresztą nie wiem, czy to samo). Nie można by pisać w tych samych słowach tego samego?)