我正在编辑一段代码,它是一个大项目的一部分,它使用“const”来初始化一堆数组。 因为我想参数化这些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”,这样它们就可以作为恰好设置一次的参数。
总结:如何为结构内的子结构正确分配内存? 非常感谢你!
最高
答案 0 :(得分:6)
我怀疑你对C ++的经验不多。逻辑解决方案是在构造函数中分配内存。从这个级别开始教授C ++会相当复杂。
答案 1 :(得分:4)
这是C或C ++代码。标签说C ++,但代码看起来就像C.为什么使用malloc
代替new
?
回答你的问题。给struct一个构造函数来分配内存和析构函数来删除它。
请记住,在C ++中,类和结构之间的唯一区别是成员在类中默认是私有的,默认情况下在结构中是公共的。
答案 2 :(得分: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;
};
答案 3 :(得分:0)
你可以创建一个函数initialize_bigStruct()并在每个bigStruct定义之后使用它。您需要使用简单的查找/替换来修改代码。
在C中不允许添加函数,但是如果您使用C ++则完全不同。
答案 4 :(得分: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。