2

Cでmallocで動的配列を作成するために構造体へのポインタへのポインタを作成しているのですが、構造体配列の呼び出しでセグメンテーション違反になります。これが私のコードの簡単な要約です:

#include <stdio.h>

typedef struct {
    int test1;
    int test2;
    }testStruct;

int main() {
    testStruct **neato;

    neato = (testStruct **) malloc( sizeof(testStruct *) * 5);
    // Array of 5 for convience

    // any neato[x]->testy call results in segmentation fault.
    scanf("%d", &neato[0]->test1);    // Segmentation fault

    return 0;
    }

(*neato)[0].test1 などの他の呼び出しを試しましたが、すべてセグメンテーション違反が発生しました。これは明らかにこれを行う適切な方法ではありません。または、私の GNU コンパイラが非常に古くなっています。

4

3 に答える 3

5

5 つのポインターに十分なメモリを割り当てました。ただし、ポインターを初期化していないため、ポインターはガベージです。ポインターを割り当ててから、各ポインターの初期化に進みます。

int elems = 5;

neato = malloc(sizeof(testStruct *) * elems);
for( i = 0; i < elems; ++i ) {
    neato[i] = malloc(sizeof(testStruct));
}

余談ですが、ここではポインターの配列が必要だとは思いません。単純に 5 秒分のスペースを割り当ててtestStruct(つまりneatoa になるtestStruct*)、そのポインタのアドレスを初期化する関数に渡さないのはなぜでしょうか?

于 2012-04-05T02:40:19.897 に答える
0

mallocing追加する必要があるすべての構造自体のためのスペースではありません

for(int i = 0; i < 5; i++) {
    neato[i] = malloc(sizeof(testStruct));
}

ニートをmallocした後。また、malloc からの戻り値をチェックして、NULLmalloc が渡されたことを確認する必要があります。

于 2012-04-05T02:41:40.867 に答える
0

ポインターの配列を割り当てましたが、これらのポインターに有効なアドレスを割り当てませんでした。

動的配列のみを作成する場合は、構造体へのポインターのみを使用します。

testStruct *neato;
neato = malloc( sizeof(testStruct) * 5);
scanf("%d", &neato[0].test1);
于 2012-04-05T02:42:42.293 に答える