2011-10-23 5 views
6

Ho trovato risposte utili alle domande di altre persone qui infinite volte su StackOverflow, ma questa è la prima volta che faccio una mia domanda personale.Assegnazione dinamica di una serie di strutture

Ho una funzione C che ha bisogno di allocare dinamicamente lo spazio per una matrice di strutture e quindi di riempire i membri della struct di ciascun elemento dell'array con i valori estratti da un file. L'assegnazione dei membri funziona bene al primo passaggio del ciclo, ma al secondo passaggio viene visualizzato un errore di segmentazione.

ho scritto questo programma rapido che illustra gli elementi essenziali del problema che sto avendo:

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

L'uscita che ricevo da questo è:

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

non sono sicuro dove sta il mio problema Sembra che la chiamata malloc stia assegnando spazio sufficiente a una struttura solo quando dovrebbe allocare lo spazio per cinque.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

6

L'errore è qui:

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

si dovrebbe fare questo:

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

Il motivo è che si sta indicizzazione del "dimensione" sbagliato di data.

+0

È necessario dereferenziare 'dati' anche nella stampa – MahlerFive

+0

Sì, hai ragione. Fisso. – Mysticial

+0

Grazie per la risposta incredibilmente veloce! –