1

我正在通过 Learn C The Hard Way 工作,并且对某些事情感到困惑。我已经编写了我遇到的问题的简化版本,以便更容易理解它:

#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 它告诉我这是未初始化的空间。为什么是这样?

4

2 回答 2

4

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

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

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

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

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

于 2012-04-05T17:27:04.783 回答
2

你从来没有为Dummy自己分配空间。您需要执行以下操作:

group1->dummies = malloc(sizeof(Dummy *) * GROUP_SIZE);
for(int i = 0; i < GROUP_SIZE; i++) {
   group1->dummies[i] = malloc(sizeof(struct Dummy));
}
于 2012-04-05T17:25:06.187 回答