2012-04-05 105 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; 
    } 

我试过其他类似的调用(* NEATO)[0] .test1和所有导致分段错误。这显然不是这样做的正确方法,或者我的GNU编译器严重过时。

+2

不要投malloc'的'的返回值。请参阅:http://c-faq.com/malloc/mallocnocast.html – 2012-04-05 02:44:19

回答

5

您已经为5个指针分配了足够的内存。你还没有初始化指针,所以它们是垃圾。分配指针,然后继续初始化每个指针。我在这里看不到一个指针数组。为什么不简单地为其分配足够的空间(即neato变为testStruct*)并将该指针的地址传递给初始化它的函数?

+0

D'oh!直奔我的头。谢谢你的帮助。 – 2012-04-05 02:50:45

0

你是不是对所有的结构mallocing空间本身必须添加

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

你的malloc NEATO后。你也应该从malloc中检查你的返回值NULL以确保malloc通过。

+0

不需要在C中输入'malloc'的结果。 – 2012-04-05 02:42:25

+0

@EdS。确实如此,但并没有受到伤害。 – twain249 2012-04-05 02:44:01

+0

它实际上可以。这是完全没有必要的,只是为了增加代码的冗长度,并且实际上它可能会以更有意义的方式变坏。请参阅:http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – 2012-04-05 02:44:33

0

您分配了指针数组,但未将有效地址分配给这些指针。

如果你只是想创建动态数组,使用时只需指向结构:

testStruct *neato; 
neato = malloc(sizeof(testStruct) * 5); 
scanf("%d", &neato[0].test1);