为C中的结构包装的2d指针数组分配内存

时间:2013-04-24 02:06:01

标签: c pointers memory multidimensional-array allocation

假设我有一个名为'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))

有人能帮助我吗?

2 个答案:

答案 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);

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