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 testStructs 分配足够的空间(即neato变为 a testStruct*)并将该指针的地址传递给初始化它的函数?

于 2012-04-05T02:40:19.897 回答
0

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

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

在你 malloc 整齐之后。此外,您应该检查 malloc 的返回值,NULL以确保 malloc 已通过。

于 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 回答