如何正确使用结构内的指针数组

时间:2013-04-15 19:11:54

标签: c pointers memory-management malloc structure

我有两个结构父母和孩子,你可以在下面的代码中看到。父结构有一个类型为child的指针数组。程序进入for循环时出现segmetation错误。我的代码有什么问题吗? 我不想使用方括号的原因是我有一个函数,它接受一个类型为child的指针参数,我希望将每个子指针传递给该函数,而不需要使用&。

任何帮助将不胜感激 谢谢

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
   int id;
} child;

typedef struct {
   child** c;
} parent;

int main(int argc, char **argv) {
    int number_of_children = 5;

parent* p = (parent*)malloc(sizeof(parent));

p -> c = (child **) malloc(number_of_children * sizeof(child*));

int i;
for(i=0; i<number_of_children; i++)
    p -> c[i] -> id = i;
}

2 个答案:

答案 0 :(得分:5)

您正在正确分配子指针表,但您没有分配任何子项。

int i
for(i = 0; i < number_of_children; ++i) {
    p->c[i] = (child *) malloc(sizeof(child));
    p -> c[i] -> id = i
}

答案 1 :(得分:1)

未经测试,但它应该是这样的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
   int id;
} child;

typedef struct {
   child** c;
} parent;

int main(int argc, char **argv) {
    const int number_of_children = 5;

    parent* p = malloc(sizeof(parent));
    if(p == NULL) halt_and_catch_fire();

    p->c = malloc(number_of_children * sizeof(child*));
    if(p->c == NULL) halt_and_catch_fire();    

    for(int i=0; i<number_of_children; i++)
    {
        p->c[i] = malloc(sizeof(child));
        if(p->c[i] == NULL) halt_and_catch_fire();

        p->c[i]->id = i;
    }

    // free() *everything* allocated
}

正如我们所看到的,您正在尝试分配一个分段指针到指针的东西,这是没有明显需要的,因为您没有分配多个最内层对象。如果您正在尝试创建一个多维数组,则不应该进行分段混乱,do like this instead