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

ダミーの 1 つに名前ポインターを設定しようとすると、セグ フォールトが発生します。valgrind を使用すると、これは初期化されていないスペースであることがわかります。どうしてこれなの?

4

2 に答える 2

4

使用は、その宣言dummiesと矛盾しているようです。フィールドの使用方法から、構造体の配列の配列ではなく、構造体の配列として意図されているように見えます。その場合は、宣言を次のように変更します。dummiesdummiesDummyDummy

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

次に、使用方法を次のように変更します。

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

もちろん、これはそれGROUP_SIZEが 4 つ以上であることを前提としています。

于 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 に答える