为什么访问malloced数组结构的成员会出错?

时间:2012-04-05 17:22:04

标签: c memory-management segmentation-fault malloc

我正在通过学​​习C艰难的方式工作,并且我对某些事情感到难过。我已经写了一个我正在遇到的问题的简化版本,以便更容易理解它:

#include <stdlib.h>

#define GROUP_SIZE 10
#define DATA_SIZE 64

struct Dummy {
    char *name;
};

struct Group {
    struct Dummy **dummies;
};

int main() {
    struct Group *group1 = malloc(sizeof(struct Group));
    group1->dummies = malloc(sizeof(struct Dummy) * GROUP_SIZE);
    struct Dummy *dummy1 = group1->dummies[3];

    // Why does this seg fault?
    dummy1->name = (char *) malloc(DATA_SIZE);

    return 0;
}

当我尝试在我的一个假人上设置名称指针时,我得到一个段错误。使用valgrind它告诉我这是未初始化的空间。这是为什么?

2 个答案:

答案 0 :(得分:4)

dummies使用似乎与其声明不一致。从您使用dummies字段的方式看,dummies似乎是Dummy结构的数组,而不是数组数组Dummy结构。如果是这种情况,请将您的声明更改为:

struct Group {
    struct Dummy *dummies; // Single asterisk
};

然后按如下方式更改您的用法:

struct Dummy *dummy1 = &group1->dummies[3];

当然,这假设GROUP_SIZE是四个或更多。

答案 1 :(得分:2)

你永远不会为Dummy本身提供空间。您需要执行以下操作:

group1->dummies = malloc(sizeof(Dummy *) * GROUP_SIZE);
for(int i = 0; i < GROUP_SIZE; i++) {
   group1->dummies[i] = malloc(sizeof(struct Dummy));
}