1

如您在下面的代码中所见,我有两个结构父子结构。父结构有一个子类型的指针数组。程序进入 for 循环时出现分段错误。我的代码有什么问题吗?我不想使用方括号的原因是我有一个函数,它接受一个子类型的指针参数,我想将每个子指针传递给该函数而不需要使用 &。

任何帮助将不胜感激谢谢

#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;
}
4

2 回答 2

5

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

int i
for(i = 0; i < number_of_children; ++i) {
    p->c[i] = (child *) malloc(sizeof(child));
    p -> c[i] -> id = i
}
于 2013-04-15T19:13:47.613 回答
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
}

正如我们所看到的,您正在尝试分配一个分段的指针到指针的东西,这显然没有必要,因为您分配的不是超过一个最内层的对象。如果你试图创建一个多维数组,你不应该把分段弄得一团糟,而是这样做

于 2013-04-15T19:21:37.793 回答