2010-03-22 67 views
5

我在编辑一段代码,这是大型项目的一部分,它使用“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”,以便它们可以充当只设置一次的参数。

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

最大

+3

你确定这是'C++'而不是'c'吗? – 2010-03-22 13:41:52

+2

**不要**在对象上使用'malloc'或'free'。构造函数和析构函数将不会被调用。使用'new'和'delete' – Yacoby 2010-03-22 13:41:59

+0

这就是所谓的坏C++风格。孩子们,永远不要做。 – 2010-03-22 13:48:15

回答

4

这是C或C++代码。标签说C++,但代码看起来就像C.为什么你使用malloc而不是new

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

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

+0

你们是对的。把结构变成一个类并使用构造函数可以做到这一点。这样我必须对代码添加最少的更改。 – Maximilien 2010-03-23 07:55:44

+0

@Maximilien,你甚至不需要把它变成一个班级。结构可以有构造函数和析构函数。只需将构造函数/析构函数添加到结构中即可。 (显然,这是C++而不是C代码) – Glen 2010-03-23 11:03:22

1

使用构造函数来完成所有的初始化(包括内存分配),和析构函数来释放内存。并且请勿使用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; 
}; 
+0

这看起来不错,但由于我不想修改很多代码,我不能使用矢量,所以我必须使用二维数组。 – Maximilien 2010-03-23 07:53:37

6

我怀疑你有一点经验与C++。合乎逻辑的解决方案是分配构造函数中的内存。在这里从这个级别开始教C++是相当复杂的。

0

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

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

0
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只是一个建议,你需要调用一个函数,因为你不能使用malloc一个STRUC里面就像你在哪里尝试。