【问题标题】:Dynamic memory inside a struct结构内的动态内存
【发布时间】:2011-01-30 08:33:33
【问题描述】:

我正在编辑一段代码,它是一个大项目的一部分,它使用“const's”来初始化一堆数组。 因为我想对这些 const 进行参数化,所以我必须调整代码以使用“malloc”来分配内存。 不幸的是,结构存在一个问题:我无法在结构本身中分配动态内存。在外面做会导致对原始代码的大量修改。

这是一个小例子:

int globalx,globaly;
struct bigStruct{
    struct subStruct{
            double info1;
            double info2;
            bool valid;
    };
    double data;

    //subStruct bar[globalx][globaly];
    subStruct ** bar=(subStruct**)malloc(globalx*sizeof(subStruct*));
    for(int i=0;i<globalx;i++)
            bar[i]=(*subStruct)malloc(globaly*sizeof(subStruct));


};
int main(){
    globalx=2;
    globaly=3;
    bigStruct foo;
    for(int i=0;i<globalx;i++)
            for(int j=0;j<globaly;j++){
                    foo.bar[i][j].info1=i+j;
                    foo.bar[i][j].info2=i*j;
                    foo.bar[i][j].valid=(i==j);
            }

    return 0;
}

注意:在我正在编辑的程序代码中,globalx 和 globaly 在指定的命名空间中是 const 的。现在我删除了“const”,因此它们可以充当只设置一次的参数。

总结:如何正确地为结构内的子结构分配内存? 非常感谢!

最大

【问题讨论】:

  • 您确定这是c++ 而不是c
  • 不要在对象上使用 mallocfree。构造函数和析构函数不会被调用。使用newdelete
  • 这就是所谓的糟糕的c++风格。孩子们,永远不要这样做。
  • 对于这里的混乱,我深表歉意。这是我正在编辑的外部项目的 C++ 代码中的一段 C 代码。
  • 现在,您似乎在 struct 中拥有原始代码,而不是在函数中。这既不合法也不很有帮助。您是否要声明 struct bigStruct 变量调用构造函数或其他什么?你不能在 C 中做到这一点。

标签: c struct malloc constants


【解决方案1】:

我怀疑您对 C++ 的经验很少。合乎逻辑的解决方案是在构造函数中分配内存。在这里从那个级别开始教授 C++ 会相当复杂。

【讨论】:

    【解决方案2】:

    这是 C 还是 C++ 代码。标签上写着 C++,但代码看起来就像 C。你为什么使用 malloc 而不是 new

    回答你的问题。给结构一个构造函数来分配内存和一个析构函数来删除它。

    请记住,在 C++ 中,类和结构之间的唯一区别是成员在类中默认为私有,而在结构中默认为公有。

    【讨论】:

    • 你们是对的。将结构更改为类并使用构造函数就可以了。这样,我必须对代码添加最少的更改。
    • @Maximilien,您甚至不必将其更改为类。结构可以有构造函数和析构函数。只需向您的结构添加构造函数/析构函数即可。 (显然这是 C++ 而不是 C 代码)
    【解决方案3】:

    使用构造函数进行所有初始化(包括内存分配),使用析构函数释放内存。并且不要使用malloc,因为您已使用C++ 标签标记了您的问题。 malloc 只是分配内存,不会初始化对象。以下示例显示了它在 C++ 中的外观:

    struct bigStruct{
        struct subStruct{
                double info1;
                double info2;
                bool valid;
        };
    
        // constructor
        bigStruct( size_t num_of_subs ) : bar( num_of_subs )
        {
        }
        // destructor
        ~bigStruct()
        {
        }        
    
    
    protected:
        double data;    
        std::vector<subStruct> bar;
    };
    

    【讨论】:

    • 这个看起来不错,但是由于我不想修改很多代码我不能使用vector,所以我必须使用二维数组..
    【解决方案4】:

    您可以创建一个函数 initialize_bigStruct() 并在每次定义 bigStruct 之后使用它。您需要通过简单的查找/替换来修改您的代码。

    在 C 中不允许添加函数,但是如果您使用 C++,则完全不同。

    【讨论】:

      【解决方案5】:
      int globalx,globaly;
      typedef struct subStruct{
              double info1;
              double info2;
              char valid;
      }subStruct;
      struct bigStruct{
          struct subStruct ** bar;
          double data;
      };
      /*Don't bother sending gl.. var since they are global*/
      void alloc_struct(struct bigStruct *foo)
      {
          int i;
          foo->bar=(subStruct**)malloc(globalx*sizeof(subStruct*));
          for(i=0; i<globalx; i++)
          {
              foo->bar[i]=(subStruct*)malloc(globaly*sizeof(subStruct));
          }
      }
      int main(){
          int i,j;
          globalx=2;
          globaly=3;
          struct bigStruct foo;
          alloc_struct(&foo);
          for(i=0;i<globalx;i++)
                  for(j=0;j<globaly;j++){
                          foo.bar[i][j].info1=i+j;
                          foo.bar[i][j].info2=i*j;
                          foo.bar[i][j].valid=(i==j);
                  }
          return 0;
      }
      

      只是 C 中的一个建议,你需要调用一个函数,因为你不能像你尝试的那样在 struc 中使用 malloc。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多