我正在使用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分配内存?
由于自动生成大量代码,修改结构是不切实际的。
答案 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。