假设我有一个名为Foo的结构体其中有一个2d指针数组
typedef struct Foo {
Stuff* (*stuff)[16];
} Foo;
我有一个initializeFoo函数像这样为整个对象分配内存
void initializeFoo(Foo **foo) {
*foo = (Foo*)malloc(sizeof(Foo));
}
然而,我只是在运行我的程序时导致分割错误(核心转储)我在想,我需要分配内存*的东西,但我该怎么做呢?我要把它放在initializeFoo函数中吗?
我的猜测是使用:
(*foo)->stuff = (Stuff*(*)[16])malloc(sizeof(Stuff))
有人能帮我一下吗? 是的,您需要为stuff
分配内存。而且,你现在拥有的实际上是一个三维的"数组"。
您也没有为stuff
分配足够的内存。
实际上,使用指针对指针来模拟二维数组可能更简单:
typedef struct Foo {
Stuff **stuff;
} Foo;
然后在initializeFoo
中:
void initializeFoo(Foo **foo)
{
*foo = malloc(sizeof(Foo));
/* Allocate first dimension, 32 items */
(*foo)->stuff = malloc(sizeof(Stuff *) * 32);
/* Allocate second dimension, 16 items each */
for (int i = 0; i < 32; i++)
(*foo)->stuff[i] = malloc(sizeof(Stuff) * 16);
}
为了确定,我需要查看您的所有代码,但我的猜测是您传递给initializeFoo本身的双指针尚未被分配。
例如:
Foo ** foo;
initializeFoo(foo);
您的程序将出现段错误,因为您解引用了未分配的foo。但是,如果使用:
Foo * foo;
initializeFoo(&foo);
或
Foo ** foo = (Foo **)malloc(sizeof(Foo *));
initializeFoo(foo);
和你的程序仍然分段错误,那么问题一定在别处。