2012-04-05 22 views
2

C言語でmallocで動的配列を作成する構造体へのポインタへのポインタを作成していますが、構造体配列を呼び出すセグメンテーションフォルトが発生します。ここに私のコードの簡単に説明です:構造体へのポインタと配列の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; 
    } 

私は(*格好いい)のような他の呼び出し[0] .test1とセグメンテーションフォールトのすべての結果を試してみました。これは明らかにこれを行う適切な方法ではありません。あるいはGNUコンパイラは真剣に時代遅れです。

+2

'malloc'の戻り値をキャストしないでください。参照:http://c-faq.com/malloc/mallocnocast.html –

答えて

5

5つのポインタに十分なメモリを割り当てました。あなたはポインタを初期化していないので、それらはゴミです。ポインターを割り当ててから、各ポインターを初期化します。

int elems = 5; 

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

ここでは、ポインタの配列は必要ありません。なぜ(つまり、neatotestStruct*になる)に十分なスペースを割り当てて、そのポインタのアドレスを初期化する関数に渡すのはなぜですか?

+0

D'oh!私の頭の上にまっすぐに行った。ご協力いただきありがとうございます。 –

0

は、あなたはあなたのmalloc格好いい後

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

を追加する必要が自分自身をすべての構造についてmallocingスペースではありません。また、mallocから戻り値がNULLであることを確認して、mallocが成功したことを確認する必要があります。

+0

Cで 'malloc'の結果をキャストする必要はありません。 –

+0

@EdS。本当ですが、傷つけません。 – twain249

+0

実際には可能です。あなたのコードに冗長性を追加するためだけに役立つだけで完全に不必要で、実際にはより意味のある方法で悪いことがあります。参照してください:http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

0

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

あなただけの、動的配列を作成したいだけの構造体へのポインタを使用する場合:

testStruct *neato; 
neato = malloc(sizeof(testStruct) * 5); 
scanf("%d", &neato[0].test1); 
関連する問題