2015-05-18 12 views
5

Sto provando a malloc una matrice all'interno di una struttura ma continuo a ricevere errori di segmentazione quando eseguo il programma.Malloc una matrice all'interno di una struttura

La funzione compares è solo una cosa che sto testando quindi non dovrebbe essere una parte del problema

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

si è dimenticato di allocare memoria per il 'C' prod_t *. – honk

+0

Aggiungi 'c = malloc (sizeof * c);', quindi 'c-> string = malloc (5 * sizeof * (c-> string));' – chux

+0

In genere, in un caso come questo, eseguirai il comando programma in debugger, quindi vederlo andare in crash su qualche riga, quindi esaminare i valori delle variabili su quella linea. In questo caso vedresti che 'c' è' NULL' quando il programma si blocca mentre provi ad accedere a 'c-> string'. – hyde

risposta

1

Prima di tutto, non gettato risultato di malloc. Hai solo bisogno di farlo in C++. In C, può effettivamente nascondere potenziali problemi.

In secondo luogo, è necessario assegnare (o dichiarare staticamente) la propria struttura.

Terzo, c-> magazzino non esiste. Probabilmente intendevi 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

I letterali stringa ottengono automaticamente un terminatore 0, non è necessario farlo esplicitamente. – Barmar

+0

Hai ragione. L'ho riparato. – rost0031

+1

Cosa, ti aspetti che io presti attenzione o qualcosa del genere :) L'ho risolto ora. – rost0031

4

Il problema è che si sta allocando lo spazio per la stringa, ma sei non allocazione del struct a tutti. c rimane impostato su NULL e si sta tentando di dereferenziarlo.

allocare spazio per la struct prima di assegnare ai suoi membri

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

E, come nota a margine per la vostra next-to-fix errore: questo campo non esiste

c->stock