2011-10-23 22 views
6

He encontrado respuestas útiles sobre las preguntas de otras personas innumerables veces aquí en stackoverflow, pero esta es la primera vez que hago una pregunta por mi cuenta.Asignación dinámica de una matriz de estructuras

Tengo una función C que dinámicamente necesita asignar espacio para una matriz de estructuras y luego llenar los miembros de la estructura de cada elemento de la matriz con los valores extraídos de un archivo. La asignación de miembros funciona bien en la primera pasada del ciclo, pero recibo una falla de segmentación en el segundo pase.

He escrito este programa rápido que ilustra los elementos esenciales del problema que estoy teniendo:

#include <stdlib.h> 
#include <stdio.h> 

typedef struct { 
     int a; 
     int b; 
} myStruct; 

void getData(int* count, myStruct** data) { 
    *count = 5; 
    *data = malloc(*count * sizeof(myStruct)); 

    int i; 
    for (i = 0; i < *count; i++) { 
     data[i]->a = i; 
     data[i]->b = i * 2; 
     printf("%d.a: %d\n", i, data[i]->a); 
     printf("%d.b: %d\n", i, data[i]->b); 
    } 
} 

int main() { 
    int count; 
    myStruct* data; 
    getData(&count, &data); 
    return 0; 
} 

La salida que recibo de esto es:

0.a: 0 
0.b: 0 
Segmentation fault 

No estoy seguro donde yace mi problema Parece que la llamada malloc solo está asignando suficiente espacio para una estructura cuando debe asignar espacio para cinco.

Cualquier ayuda sería muy apreciada.

Respuesta

6

El error está aquí:

for (i = 0; i < *count; i++) { 
    data[i]->a = i; 
    data[i]->b = i * 2; 
    printf("%d.a: %d\n", i, data[i]->a); 
    printf("%d.b: %d\n", i, data[i]->b); 
} 

usted debe hacer esto:

for (i = 0; i < *count; i++) { 
    (*data)[i].a = i; 
    (*data)[i].b = i * 2; 
    printf("%d.a: %d\n", i, (*data)[i].a); 
    printf("%d.b: %d\n", i, (*data)[i].b); 
} 

La razón es que usted está indexando la "dimensión" equivocado de data.

+0

Necesita desreferenciar 'datos' en los printfs también – MahlerFive

+0

Sí, tiene razón. Fijo. – Mysticial

+0

¡Gracias por la respuesta increíblemente rápida! –

Cuestiones relacionadas