2013-10-27 26 views
7

Leggerò in due set di char* (o stringhe) utilizzando strtok e poiché questi due set di caratteri sono correlati, (address : command\n) ho deciso di utilizzare una struttura.Come correttamente malloc per array di struct in C

struct line* array = (struct line*)malloc(sizeof(file) * sizeof(struct line*)); 

Questa linea malloc spazio ing per la funzione mi dà un errore di segmentazione e mi chiedevo se mi può dire un modo corretto di malloc spazio per questo. Per il contesto, ecco il resto del mio codice:

struct line 
{ 
    char* addr; 
    char* inst; 
}; 
while loop{ 
    x = strtok(line,": "); 
    y = strtok(NULL,"\n"); 
    strcpy(array[i].addr,x); //assume that x and y are always 3characters 
    strcpy(array[i].inst,++y); 
    i++; 
} 
+2

Tenere in tenere presente che allocare memoria per un array di 'struct line' non alloca memoria per le stringhe' addr' e 'inst'.A seconda di come vengono utilizzati quei puntatori all'interno della 'struct line', potrebbe essere necessario allocare la memoria per i dati della stringa. –

risposta

13

L'assegnazione funziona allo stesso modo per tutti i tipi. Se è necessario allocare una matrice di line struct, di farlo con:

struct line* array = malloc(number_of_elements * sizeof(struct line)); 

Nel codice, si erano assegnano una matrice che ha avuto la dimensione appropriata per line puntatori, non per line strutture. Si noti inoltre che non vi è alcun motivo per trasmettere il valore restituito di malloc().

Nota che è il suo stile meglio utilizzare:

sizeof(*array) 

invece di:

sizeof(struct line) 

La ragione di questo è che l'allocazione continuerà a funzionare come previsto nel caso in cui si cambia il tipo di array . In questo caso è improbabile, ma è solo una cosa generale che vale la pena abituarsi.

Si noti inoltre che è possibile per evitare di dover ripetere la parola struct più e più volte, dal typedef ing struct:

typedef struct line 
{ 
    char* addr; 
    char* inst; 
} line; 

È quindi possibile solo fare:

line* array = malloc(number_of_elements * sizeof(*array)); 

Naturalmente non dimenticate di allocare anche memoria per array.addr e array.inst.

3

Per quello che hai descritto, Non è necessario allocare memoria per la vostra struct, piuttosto, è necessario allocare memoria per i membri char *addr; e char *inst;. Se si desidera avere una singola copia di quella struttura, la prima sezione di codice illustra come inizializzare e assegnare valori. Se si desidera un array, il secondo esempio di codice illustra le differenze.

Questo illustra come allocare memoria per i membri di una singola linea struct :

typedef struct 
{ 
    char* addr; 
    char* inst; 
}LINE; 

LINE line; 

int main(void) 
{ 

    strcpy(line.addr, "anystring"); //will fail 
    line.addr = malloc(80); 
    line.inst = malloc(80); 
    strcpy(line.addr, "someString");//success; 
    strcpy(line.inst, "someOtherString");//success; 

} 

Per matrice di linea struct ...

typedef struct 
{ 
    char* addr; 
    char* inst; 
}LINE; //same struct definition 

LINE line[10]; //but create an array of line here. 

int main(void) 
{ 
    int i; 

    for(i=0;i<10;i++) 
    { 
     line[i].addr = malloc(80); 
     line[i].inst = malloc(80); 
    } 

    for(i=0;i<10;i++) 
    { 
     strcpy(line[i].addr, "someString"); 
     strcpy(line[i].inst, "someOtherString"); 
    } 
    //when done, free memory 
    for(i=0;i<10;i++) 
    { 
     free(line[i].addr); 
     free(line[i].inst); 
    }  


} 
+0

Oppure usa 'strdup()' e usa il resto degli 80 caratteri per qualcosa di più utile. :-) –

+0

@AdamLiss - Non posso discutere con più utile. – ryyker