2015-05-18 13 views
5

Próbuję malloc tablica wewnątrz struktury, ale nadal dostaję błędy segmentacji po uruchomieniu programu.Malloc tablica wewnątrz struktury

Funkcja compares jest po prostu coś mi badania, więc nie powinno być częścią problemu

typedef struct { 
    char *string; 
} prod_t; 

int 
main(int agrc, char **argv){ 
    int i = 0; 
    prod_t *c = NULL; 

    char str2[100] = "abcd"; 
    c->string = (char *) malloc(5 * sizeof(char)); 
    strcpy(c->string,str2); 

    compares(c->stock,str2,i); 

    return 0; 
} 
+3

Nie pamiętasz, aby przydzielić pamięć dla twojego 'prod_t * c'. – honk

+0

Dodaj 'c = malloc (sizeof * c);', następnie 'c-> string = malloc (5 * sizeof * (c-> string));' – chux

+0

Zwykle w takim przypadku wystarczy uruchomić program pod debuggerem, a następnie sprawdź awarię w pewnym wierszu, a następnie sprawdź wartości zmiennych w tej linii. W tym przypadku zobaczysz, że 'c' ma wartość' NULL', gdy program ulega awarii podczas próby dostępu do 'c-> string'. – hyde

Odpowiedz

1

Przede wszystkim nie oddanych wynik malloc. Trzeba to zrobić tylko w C++. W języku C może faktycznie ukryć potencjalne problemy.

Po drugie, musisz przydzielić (lub statycznie zadeklarować) swoją strukturę.

Po trzecie, c-> stock nie istnieje. Prawdopodobnie chodziło o c-> string.

typedef struct { 
    char *string; 
} prod_t; 

int 
main(int agrc, char **argv){ 
    int i = 0; 
    prod_t *c = malloc(sizeof(prod_t); 


    char str2[100] = "abcd"; 
    c->string = malloc(5 * sizeof(char)); 
    strcpy(c->string,str2); 

    compares(c->string,str2,i); 

    return 0; 
} 
+1

Literał ciągu automatycznie otrzymuje terminator 0, nie trzeba tego robić jawnie. – Barmar

+0

Masz rację. Naprawiłem to. – rost0031

+1

Co, oczekujesz, że zwrócę na to uwagę lub coś takiego :) Naprawiłem to teraz. – rost0031

4

Problemem jest to, że jesteś przydzielenie miejsca na łańcuchu, ale jesteś nie alokacji struct w ogóle. c pozostaje ustawiony na NULL i próbujesz usunąć z niego dereferencję.

Przydzielanie przestrzeni dla struct przed przypisaniem jej członkom

prod_t *c = malloc(sizeof(prod_t)); 

I jak sidenote dla Twojego obok-to-fix Błąd: to pole nie istnieje

c->stock