在C语言中,为包装在结构体中的2d指针数组分配内存



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

和你的程序仍然分段错误,那么问题一定在别处。

相关内容

  • 没有找到相关文章

最新更新