Pasando una matriz dinámica de estructura a función para asignación

Tienes que crear una matriz de estructura. Dado que no se sabe cuántas entradas habrá en la matriz, se debe usar una matriz dinámica.

No funcionó como se recomienda aquí: https://stackoverflow.com/a/8455125/1090944 .

Tener problemas con pasar la matriz de estructura para funcionar para la asignación.

Aquí está el código:

#include #include struct record { char * community_name; double data[10]; double crimes_per_pop; }; void allocate_struct_array(struct record * array, int length); int main() { int num_lines = 10; struct record ** data_array; allocate_struct_array(&data_array, num_lines); data_array[0]->community_name[0] = 'h'; printf("%c\n", data_array[0]->community_name[0]); return 0; } void allocate_struct_array(struct record * array, int length) { int i; *array = malloc(length * sizeof(struct record *)); if (!array) { fprintf(stderr, "Could not allocate the array of struct record *\n"); exit(1); } for (i = 0; i community_name = malloc(100 * sizeof(char)); } } 

Aquí hay errores y advertencias que recibí del comstackdor:

 ../src/temp.c: In function 'main': ../src/temp.c:19: warning: passing argument 1 of 'allocate_struct_array' from incompatible pointer type ../src/temp.c: In function 'allocate_struct_array': ../src/temp.c:32: error: incompatible types in assignment ../src/temp.c:42: error: incompatible types in assignment ../src/temp.c:44: error: wrong type argument to unary exclamation mark ../src/temp.c:50: error: invalid type argument of '->' make: *** [src/temp.o] Error 1 

Creo que te perdiste la corrección de la respuesta original, así que lo explicaré aquí …

 #include #include struct record { char * community_name; double data[10]; double crimes_per_pop; }; void allocate_struct_array(struct record ** array_pointer, int length); /* the allocate_struct_array should take a POINTER to a POINTER */ int main() { int num_lines = 10; /* this is wrong: struct record ** data_array; */ /* it should be: */ struct record *data_array; allocate_struct_array(&data_array, num_lines); /* NOW this will work */ data_array[0]->community_name[0] = 'h'; /* THIS WILL STILL CRASH community_name is not allocated!!! */ printf("%c\n", data_array[0]->community_name[0]); return 0; } void allocate_struct_array(struct record **array_pointer, int length) { int i; struct record *array; array = malloc(length * sizeof(struct record *)); if (!array) { fprintf(stderr, "Could not allocate the array of struct record *\n"); exit(1); } for (i = 0; i < length; i++) { array[i] = malloc( sizeof(struct record) ); if (!array[i]) { fprintf(stderr, "Could not allocate array[%d]\n", i); exit(1); } } *array_pointer = array; /* copied over. */ } 

Por cierto, me gustaría mostrarle una buena implementación en C del registro de asignaciones de estructura:

Se intercambian sus firmas. En su función principal, data_array se debe declarar como un struct record* array , con solo un * . Su función allocate_struct_array debería, en cambio, tomar la struct record** array , con dos * ‘s.

Cada * es otra capa de direccionamiento indirecto. Debe comenzar con solo una capa de direccionamiento indirecto en la función principal (es indirecto porque se refiere a estructuras múltiples con una variable).

Luego agrega otra capa de direccionamiento indirecto en su función allocate_struct_array, ya que necesita modificar una variable de otra función. Puede ver esta adición de direccionamiento indirecto cuando usa el operador & en su llamada de allocate_struct_array.