指向结构的指针和指向数组的malloc内存的指针

时间:2012-04-05 02:38:09

标签: c pointers malloc

我正在创建一个指向结构的指针,以在C中创建一个带malloc的动态数组,但是我得到一个调用struct数组的分段错误。以下是我的代码的快速概述:

#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编译器严重过时。

3 个答案:

答案 0 :(得分:5)

你为5个指针分配了足够的内存。但是你没有初始化指针,所以它们是垃圾。分配指针,然后继续初始化每个指针。

int elems = 5;

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

另外,我不认为这里需要一个指针数组。为什么不简单地为5 testStruct s分配足够的空间(即neato成为testStruct*)并将该指针的地址传递给初始化它的函数?

答案 1 :(得分:0)

对于您必须添加的所有结构,您不是mallocing空间

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

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

答案 2 :(得分:0)

您分配了指针数组,但没有为这些指针分配有效地址。

如果您只想创建动态数组,请使用指向结构的指针:

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