2011-10-23 192 views
6

我已經在其他人的問題上找到了無數次有用的答案,這裏是在stackoverflow上,但這是我第一次問自己的問題。結構數組的動態分配

我有一個C函數,它動態地需要爲結構數組分配空間,然後用從文件中提取的值填充每個數組元素的結構成員。成員分配在循環的第一遍中工作正常,但在第二遍時出現分段錯誤。

我已經寫了這個快速程序說明我有這個問題的要領:

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

我從這個得到的輸出是:

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

我不知道我的問題在哪裏。似乎malloc調用只爲一個結構分配足夠的空間,當它應該爲五個空間分配空間時。

任何幫助將是非常讚賞。

回答

6

的錯誤是在這裏:

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

你應該這樣做:

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

的原因是,你是索引的data錯誤的 「尺寸」。

+0

您還需要在printfs中取消引用'data' – MahlerFive

+0

是的,您是對的。固定。 – Mysticial

+0

感謝您的快速反應! –