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.