C 结构中的动态内存
我正在编辑一段代码,这是一个大项目的一部分,它使用“const”来初始化一组数组。 因为我想参数化这些常量,所以我必须调整代码以使用“malloc”来分配内存。 不幸的是,结构有一个问题:我无法在结构本身中分配动态内存。在外部执行此操作将导致对原始代码进行大量修改 下面是一个小例子:C 结构中的动态内存,c,struct,malloc,constants,C,Struct,Malloc,Constants,我正在编辑一段代码,这是一个大项目的一部分,它使用“const”来初始化一组数组。 因为我想参数化这些常量,所以我必须调整代码以使用“malloc”来分配内存。 不幸的是,结构有一个问题:我无法在结构本身中分配动态内存。在外部执行此操作将导致对原始代码进行大量修改 下面是一个小例子: int globalx,globaly; struct bigStruct{ struct subStruct{ double info1; double i
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;
}
int globalx,globaly;
结构bigStruct{
结构子结构{
双信息1;
双信息2;
布尔有效;
};
双重数据;
//子结构条[globalx][globaly];
子结构**bar=(子结构**)malloc(globalx*sizeof(子结构*);
对于(int i=0;i使用构造函数进行所有初始化(包括内存分配),和析构函数来释放内存。不要使用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;
};
struct bigStruct{
结构子结构{
双信息1;
双信息2;
布尔有效;
};
//建造师
bigStruct(大小和数量):条(数量)
{
}
//析构函数
~bigStruct()
{
}
受保护的:
双重数据;
向量条;
};
我怀疑你对C++没有什么经验。逻辑解决方案是在构造函数中分配内存。从这里开始教C++是相当复杂的。
< P>是C或C++代码。标签是C++,但是代码看起来像C。为什么你使用<代码> MalOC 而不是<代码>新< /COD>?< /P>
回答你的问题。给结构一个构造函数来分配内存,给它一个析构函数来删除内存
请记住,C++中,类和结构之间的唯一区别是默认情况下成员在类中是私有的,在结构中默认为公共的.< /p> 可以在函数中定义一个函数IrraseZeBigStutt.(),并且在BigStutt的每个定义之后使用它。
在C中不允许添加函数,但是如果使用C++,则完全不同。
<代码> int GULALX,GULALY;
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;
}
类型定义结构子结构{
双信息1;
双信息2;
字符有效;
}子结构;
结构bigStruct{
结构子结构**bar;
双重数据;
};
/*不要麻烦发送gl..var,因为它们是全局的*/
void alloc_struct(struct bigStruct*foo)
{
int i;
foo->bar=(子结构**)malloc(globalx*sizeof(子结构*);
对于(i=0;ibar[i]=(子结构*)malloc(全局*sizeof(子结构));
}
}
int main(){
int i,j;
globalx=2;
全局=3;
struct bigStruct foo;
alloc_结构(&foo);
对于(i=0;您确信这是代码> C++ +<代码>,而不是<代码> c>代码>?不要在对象上使用<代码> Malc C < /C>或<代码>免费>代码>。不使用构造函数和析构函数。使用<代码>新< /COD>和<代码>删除>代码>这就是所谓的坏C++风格。孩子们,永远不要这样做。我很抱歉这里的混乱。这是一个C代码。我正在编辑的外部项目的C++代码。现在,你似乎在<代码>结构> <代码>中有原始代码,而不是在函数中。这既不合法也不太有帮助。你是想声明一个<代码>结构BigStuts< /Cuff>变量调用构造函数还是什么?你不能在C中这样做。这看起来不错,但是自从我我不想修改很多代码我不能使用vector,所以我必须使用二维数组..你们说得对。将结构更改为类并使用构造函数就可以了。这样我必须对代码进行最小的更改。@Maximilien,你甚至不必将其更改为类。结构可以有构造函数和析构函数。J在结构中添加一个构造函数/析构函数将有效。(这是C++,而不是C代码,很明显)