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

Function with pointers: Member reference base type (...) is not a structure or union

我有以下错误:

"error: member reference base type 'start' (aka 'struct no_start *') is not a structure or union".

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

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,其中包含结构,最后一个 functions.h,我在其中声明第一个文件的函数.

我不明白为什么会出现此错误。对于每个函数,我得到的错误与分配的错误一样多。

您不需要键入 malloc 的 return。这样做会创建一个指向指针的指针。作为非强制转换的 malloc 调用将 return 指向为您的结构分配的内存的指针

我不会

typedef struct no_start * start;

即 typedef something as a pointer to a structure 而无需执行

  • 结构本身的类型定义
  • 将指针 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));

展开 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-typedefs",除非它们用于不透明类型(即隐藏结构定义的地方)。

如果你不喜欢在任何地方输入 struct(这在 C++ 中是不必要的),你可以对结构进行类型定义:

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

我的错误是创建了结构指针。

我有typedef struct no_start * start;

相反,我需要 typedef struct no_start start;