我正在通过学习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它告诉我这是未初始化的空间。这是为什么?
答案 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));
}