[C] Niejasnosc przy wskaźnikach na struktury

Matiks21
Użytkownik
Użytkownik
Posty: 562
Rejestracja: 20 maja 2013, o 16:33
Płeć: Mężczyzna
Lokalizacja: Kielce
Podziękował: 98 razy

[C] Niejasnosc przy wskaźnikach na struktury

Post autor: Matiks21 »

Witam,

mogłby mi ktoś wyjaśnić czemu taki kod nie chcę się skompilować?

Kod: Zaznacz cały

main()
{
	struct  node{
   int key;
  struct node *left,*right;
 } *korzen;
 
 korzen->key=10;
 
 printf("%d",korzen->key);
 
 
}
korzen->key to to samo co (*korzen).key zatem jest to zmienna typu int, nie rozumiem tego.
A może jest to wina mojego kompilatora?
Ostatnio zmieniony 2 wrz 2015, o 18:06 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości.
Awatar użytkownika
Zaratustra
Użytkownik
Użytkownik
Posty: 182
Rejestracja: 24 lut 2015, o 16:10
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 68 razy
Pomógł: 6 razy

[C] Niejasnosc przy wskaźnikach na struktury

Post autor: Zaratustra »

Nie, nie jest to wina kompilatora. Gcc w wersji której używam skompilował kod ale oczywiście program się wysypuje - ponieważ prosisz się o wyciek pamięci .
Już pokazuję w czym rzecz:

Kod: Zaznacz cały

    struct  node{
       int key;
       struct node *left,*right;
    } *korzen; \TUTAJ deklarujesz jedynie >wskaźnik< do struktury który
    \nie wskazuje na żadną istniejącą strukturę.

     korzen->key=10; \TUTAJ próbujesz przypisać liczbę,
     \do składowej struktury na którą wskazuje wskaźnik o nazwie "korzen",
     \ale ten wskaźnika nie wskazuje na żadną strukturę!
Proponuję w ogóle unikać tej składni, zgrabniej było by zrobić to w ten sposób:

Kod: Zaznacz cały

    struct node{
        int key;
        struct node *left,*right;
    };
    node* korzen;
    korzen=NULL;\TUTAJ wyraźnie widać że "korzen" na nic(jeszcze) nie wskazuje.
Potem oczywiście trzeba stworzyć strukturę i przypisać do wskaźnika np. tak:

Kod: Zaznacz cały

korzen = new node();
I potem zwolnić zaalokowaną pamięć:

Kod: Zaznacz cały

delete korzen;
Jeśli piszesz w czystym C to oczywiście korzystasz zamiast new i delete z funkcji malloc i free(ale dla mnie to strasznie stare dzieje z czystym C ).
ODPOWIEDZ