2010-04-04 13 views
5

Estoy tratando de crear una matriz de estructuras y también un puntero a esa matriz. No sé cuán grande va a ser la matriz, por lo que debe ser dinámica. Mi estructura sería algo como esto:Matriz de estructuras en C

typedef struct _stats_t 
{ 
int hours[24]; int numPostsInHour; 
int days[7]; int numPostsInDay; 
int weeks[20]; int numPostsInWeek; 
int totNumLinesInPosts; 
int numPostsAnalyzed; 

} stats_t; 

... y necesito tener varias de estas estructuras para cada archivo (cantidad desconocida) que voy a analizar. No estoy seguro de cómo hacer esto. No me gusta el siguiente enfoque debido al límite del tamaño de la matriz:

# define MAX 10 
typedef struct _stats_t 
{ 
int hours[24]; int numPostsInHour; 
int days[7]; int numPostsInDay; 
int weeks[20]; int numPostsInWeek; 
int totNumLinesInPosts; 
int numPostsAnalyzed; 

} stats_t[MAX]; 

Entonces, ¿cómo habría que crear esta matriz? Además, ¿un puntero a esta matriz se vería así?

stats_t stats[]; 
stats_t *statsPtr = &stats[0]; 
+1

Preguntas: ¿Se puede gestionar una matriz dinámica de 'int'? ¿Puedes gestionar una matriz estática de 'struct'? Si hay respuesta a cualquiera de estas preguntas es "No", le sugiero que trabaje en eso primero. Una vez que pueda administrar ambos, la respuesta a * esto * debería ser obvia. Por último, puedes encontrar ayuda en los dos anteriores en Stack Overflow. – dmckee

Respuesta

5

Esto es lo que se suele hacer:

int n = <number of elements needed> 
stats_t *ptr = malloc (n * sizeof (stats_t)); 

Luego, para rellenarlo,

for (int j = 0; j < n; ++j) 
{ 
    ptr [j] .hours = whatever 
    ptr [j] .days = whatever 
    ... 
} 
+1

a) Debería usar 'size_t' en lugar de' int'. 'int' es un tipo firmado, y rara vez queremos asignar una matriz con -1 de longitud. b) Utilizaría 'sizeof * ptr' en lugar de' sizeof (stats_t) ', pero aquí no importa. –

+0

Gracias por sus respuestas. Entiendo cómo asignar la memoria y acceder a ella, pero el problema es que voy a malloc una estructura a la vez. Cada vez que aparece un nuevo archivo, voy a malloc otra estructura para ello. Así que no puedo malloc 'n' structs y luego volver y trabajar en él, más bien tengo que decir "Aquí está el conjunto, expandirlo (agregarlo) una vez cada vez que aparece un archivo nuevo". ¿Tiene sentido? – Hristo

+0

@Hristo: para eso, use la función 'realloc()' para cambiar el tamaño de una matriz asignada con 'malloc()'. Es por eso que se llama asignación dinámica. –

2

La segunda opción de un puntero es buena.

Si desea asignar dinámicamente las cosas, y luego tratar:

stats_t* theStatsPointer = (stats_t*) malloc(MAX * sizeof(stats_t)); 

como sugiere Roland.

Pero no se olvide a

free(theStatsPointer); 

cuando haya terminado.

+1

el problema es que no sé MAX de inmediato ... No sé con cuántos archivos tendré que lidiar, por lo que establecer un MAX sería una mala idea. – Hristo

+0

No quiero repetirlo, pero dado que su código es casi idéntico al de sblom (que no sea la declaración correcta de 'theStatsPointer'), consulte el punto b) en mi comentario allí. Pero +1 por recordarnos 'libre()'. –

+0

@Chris: No vi el sblorn hasta después de haber publicado. En el momento en que lo publiqué, solo vi la publicación de Roland. –

0

malloc es tu amigo aquí.

stats_t stats[] = (stats_t*)malloc(N * sizeof(stats_t)); 

stats tipo de es un puntero a la matriz. O puede usar la sintaxis stats[3] como si se hubiera declarado explícitamente como una matriz.

+0

el problema es que no lo sé 'n' de inmediato ... No sé con cuántos archivos tendré que lidiar. – Hristo

+0

a) No puede declarar algo como 'stats_t stats []'. Es una matriz sin tamaño, no es un puntero. Necesitas 'stats_t * stats'. b) Recomiendo encarecidamente no emitir el valor de retorno de 'malloc()' en el código C, y el uso de 'sizeof (stats_t)', lo que hace que el cambio del tipo de 'stats' sea más complicado. El elenco también tiene otros estigmas menos justificados asociados con él. –

+0

¿Qué recomendarías en lugar de 'sizeof'? – sblom

0

Con base en sus respuestas a las otras respuestas parece que necesita una estructura de datos dinámica como una lista vinculada Eche un vistazo al conjunto de instalaciones queue(3).

+0

gracias por la sugerencia. Lo miraré. – Hristo

+1

Las funciones 'queue (3)' no son estándar. –

+0

¿Qué biblioteca de estructura de datos C es estándar? –

Cuestiones relacionadas