【问题标题】:Allocating memory for a 2d array of pointers wrapped within an struct in C为包装在 C 结构中的 2d 指针数组分配内存
【发布时间】:2013-04-24 02:06:01
【问题描述】:

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

谁能帮帮我?

【问题讨论】:

    标签: c pointers memory multidimensional-array allocation


    【解决方案1】:

    是的,您需要为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);
    }
    

    【讨论】:

      【解决方案2】:

      为了确定,我需要查看您的所有代码,但我的猜测是您传递给 initializeFoo 本身的双指针尚未分配。

      例如,如果你这样做:

      Foo ** foo;
      initializeFoo(foo);
      

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

      Foo * foo;
      initializeFoo(&foo);
      

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

      而你的程序仍然有段错误,那么问题一定出在其他地方。

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 2019-09-23
        • 2015-04-16
        • 2013-04-18
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        相关资源
        最近更新 更多