假设我有一个名为'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))
有人能帮助我吗?
答案 0 :(得分:2)
是的,您需要为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);
}
答案 1 :(得分:1)
为了确定,我需要查看所有代码,但我的猜测是你传递给initializeFoo本身的双指针尚未分配。
例如,如果你这样做:
Foo ** foo;
initializeFoo(foo);
您的程序将因为您取消引用尚未分配的foo而发生段错误。但是,如果您使用:
Foo * foo;
initializeFoo(&foo);
或
Foo ** foo = (Foo **)malloc(sizeof(Foo *));
initializeFoo(foo);
并且您的程序仍然是段错误,那么问题必定在其他地方。