为嵌套结构指针分配内存

时间:2015-03-27 05:27:20

标签: c++ c pointers struct nested

我正在使用C代码生成器创建具有以下结构的头文件:

typdef struct Place {   
    struct Forest {
        int trees;
    } *Forest;
} Place ;

在c ++项目中使用它们。

当我尝试访问Place.Forest->树时,我得到一个段错误,因为Place.Forest是一个悬空指针。

我无法正确地使用它,因为 Place.Forest = malloc(sizeof(Place.Forest)); 只会返回指针的大小。

我不能用 Place.Forest=malloc(sizeof(struct Forest)); 因为我从C ++访问Place并且作用域使我无法看到Forest。

如何在不更改Place或un-nesting Forest的情况下为Forest分配内存?

由于自动生成大量代码,修改结构是不切实际的。

5 个答案:

答案 0 :(得分:1)

要为Forest分配内存,请执行此操作。

 Place.Forest=malloc(sizeof(struct Forest));

它会将内存分配为该结构的大小。

答案 1 :(得分:1)

经过几个小时的拧紧后,我找到了一个解决方案。

您必须使用extern C让编译器使用C样式链接,但您还必须使用C ++的作用域解析::来正确解析结构类型。

头文件:

#ifdef __cplusplus
extern "C" {
#endif

typdef struct Place {   
    struct Forest {
        int trees;
    } *Forest;
} Place ;

#ifdef __cplusplus
}
#endif

程序:

#include <stdlib.h>
#include <iostream>
extern "C" {      
    static void allocateForest(Place *p){
        p->Forest = (struct Place::Forest *)malloc(sizeof(struct Place::Forest));
    }
}

int main(void){
    Place p;
    allocateForest(&p);
    p.Forest->trees = 1;
    std::cout << p.Forest->trees << std::endl;
    return 0;
}

答案 2 :(得分:0)

Place.Forest = malloc(sizeof(Place.Forest));

应该是

Place.Forest = malloc(sizeof(struct Forest));

因为您看到Forest是指向您的结构的指针,sizeof(pointer)不是您想要的内容sizeof(struct Forest)

答案 3 :(得分:0)

在C中,嵌套的struct在整个程序中都是可见的,因此嵌套它们没有意义。只需单独定义它们(并使用typedef s,这样您就不必每次都写struct x

typedef struct {
    int trees;
} Forest;

typedef struct {   
    Forest *forest;
} Place;

现在你可以写

malloc(sizeof(Forest));

答案 4 :(得分:0)

你应该为指针分配内存,否则它们是NULL。使用此:

Place.Forest = (struct Forest*) malloc(sizeof(struct Forest));

另一件事:不要将变量命名为typedef。