0

假设我有一个名为 'Foo' 的结构,在其中我有一个二维指针数组

      typedef struct Foo {
          Stuff* (*stuff)[16];
      } Foo;

我有一个 initializeFoo 函数,它可以为整个对象分配内存

      void initializeFoo(Foo **foo) {
          *foo = (Foo*)malloc(sizeof(Foo));
      }

但是,在运行我的程序时,我会导致分段错误(核心转储),我认为我需要为 *stuff 分配内存,但我该怎么做呢?我会把它放在 initializeFoo 函数中吗?

我的猜测是使用:

    (*foo)->stuff = (Stuff*(*)[16])malloc(sizeof(Stuff))

有人可以帮我吗?

4

2 回答 2

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);
}
于 2013-04-24T02:12:55.240 回答
1

可以肯定地说,我需要查看您的所有代码,但我的猜测是您传递给 initializeFoo 本身的双指针尚未分配。

例如,如果您这样做:

Foo ** foo;
initializeFoo(foo);

您的程序将出现段错误,因为您取消引用尚未分配的 foo。但是,如果您使用:

Foo * foo;
initializeFoo(&foo);

或者

Foo ** foo = (Foo **)malloc(sizeof(Foo *));
initializeFoo(foo);

并且您的程序仍然存在段错误,那么问题一定出在其他地方。

于 2013-04-24T02:18:29.083 回答