Como realizar correctamente malloc para array de estructura en C

Leeré dos conjuntos de caracteres char* (o cadenas) utilizando strtok , y como esos dos conjuntos de caracteres están relacionados, (address : command\n) decidí usar una estructura.

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

Esta línea de espacio de centro para la función me da una falla de segmentación y me preguntaba si podría decirme una forma adecuada de espacio de malloc para ello. Para contexto, aquí está el rest de mi código:

 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++; } 

La asignación funciona de la misma manera para todos los tipos. Si necesita asignar una matriz de estructuras de line , haga eso con:

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

En su código, estaba asignando una matriz que tenía el tamaño adecuado para los punteros de line , no para las estructuras de line . También tenga en cuenta que no hay razón para emitir el valor de retorno de malloc() .

Tenga en cuenta que es mejor estilo para usar:

 sizeof(*array) 

en lugar de:

 sizeof(struct line) 

El motivo de esto es que la asignación seguirá funcionando como se esperaba en caso de que cambie el tipo de array . En este caso, esto es poco probable, pero es solo una cosa general a la que vale la pena acostumbrarse.

También tenga en cuenta que es posible evitar tener que repetir la palabra struct una y otra vez, typedef la estructura:

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

Entonces puedes simplemente hacer:

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

Por supuesto, no se olvide de asignar también memoria para array.addr y array.inst .

Para lo que ha descrito, no necesita asignar memoria para su estructura , sino que necesita asignar memoria para los miembros char *addr; , y char *inst; . Si desea tener una sola copia de esa estructura, la primera sección del código ilustra cómo inicializar y asignar valores. Si desea una matriz, el segundo ejemplo de código ilustra las diferencias.

Esto ilustra cómo asignar memoria a los miembros de una sola línea de estructura:

 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; } 

Para matriz de línea de estructura …

 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); } }