2011-10-23 146 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

感谢您的快速反应! –