C 结构中的动态内存

C 结构中的动态内存,c,struct,malloc,constants,C,Struct,Malloc,Constants,我正在编辑一段代码,这是一个大项目的一部分,它使用“const”来初始化一组数组。 因为我想参数化这些常量,所以我必须调整代码以使用“malloc”来分配内存。 不幸的是,结构有一个问题:我无法在结构本身中分配动态内存。在外部执行此操作将导致对原始代码进行大量修改 下面是一个小例子: int globalx,globaly; struct bigStruct{ struct subStruct{ double info1; double i

我正在编辑一段代码,这是一个大项目的一部分,它使用“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;
}
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代码,很明显)