结构中的动态内存

时间:2010-03-22 13:33:14

标签: c struct malloc const

我正在编辑一段代码,它是一个大项目的一部分,它使用“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”,这样它们就可以作为恰好设置一次的参数。

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

最高

5 个答案:

答案 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。