带指针的函数:成员引用基类型(...)不是结构或联合

时间:2015-04-16 18:25:02

标签: c++ c data-structures clang

我遇到以下错误:

  

“错误:成员引用基类型'开始'         (又名'struct no_start *')不是结构或联合“。

所以,我有很多结构,如:

typedef struct no_start * start;

struct no_start{
   prog * node_program;
};

这样的功能:

start * insert_start(prog * program){

   start * data = (start *) malloc(sizeof(start));

   data->node_program = program;

   return data;

}

我有一个文件functions.c,其中有这样的简单函数,一个文件structs.h,其中有结构体,最后是function.h,其中我声明了我的第一个文件的函数。

我不明白为什么我有这个错误。对于每个函数,我得到的错误与赋值一样多。

4 个答案:

答案 0 :(得分:0)

你不需要输入caste返回malloc。这样做会为指针创建一个指针。其中,非铸造的malloc调用将返回指向为结构分配的内存的指针

答案 1 :(得分:0)

我不会做

typedef struct no_start * start;

即将typedef作为指向结构的指针而不执行

  • 结构本身的typedef
  • 命名指针typedef,如start_ptr
否则人们会感到困惑。就像你自己做的那样。

 start * data = (start *) malloc(sizeof(start));

假设start是一个结构 - 它不是。你的意思是

 start  data = malloc(sizeof(struct no_start));

更好的是

typedef struct no_start{
   prog * node_program;
} start;

typedef start * start_ptr;

     start_ptr  data = malloc(sizeof(start));

答案 2 :(得分:0)

展开typedef,你会看到出了什么问题:

struct no_start ** data = (struct no_start **) malloc(sizeof(struct no_start*)); 
data->node_program = program; // Nope; *data is a pointer

您可以使用

start data = malloc(sizeof(*data));
data->node_program = program;

但通常最好避免" pointer-typedef",除非它们被用于不透明类型(即隐藏结构定义的地方)。

如果你不喜欢在任何地方输入struct(在C ++中这是不必要的),你可以输入dede结构:

typedef struct no_start no_start;

no_start* insert_start(prog* program){
   no_start* data = malloc(sizeof(*data));
   data->node_program = program;
   return data;
}

当然,在C ++中,您应该使用new,而不是malloc

答案 3 :(得分:0)

我的错误是制作结构的指针。

我有typedef struct no_start * start;

相反,我需要typedef struct no_start start;