C编程:解除指向不完整类型错误的指针

con*_*Kid 40 c struct dereference

我有一个结构定义为:

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;
Run Code Online (Sandbox Code Playgroud)

以及指向这些结构的指针数组:

struct stasher_file *files[TOTAL_STORAGE_SIZE];
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我正在指向结构并设置其成员,并将其添加到数组中:

 ...
 struct stasher_file *newFile;
 strncpy(newFile->name, name, 32);
 newFile->size = size;
 newFile->start = first_free;
 newFile->popularity = 0;
 files[num_files] = newFile;
 ...
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:取消引用指向不完整类型的指针

每当我试图访问里面的成员newFile.我究竟做错了什么?

AnT*_*AnT 49

您没有定义struct stasher_file第一个定义.您定义的是无名结构类型和该类型的变量stasher_file.由于struct stasher_file代码中没有此类型的定义,因此编译器会抱怨类型不完整.

为了定义struct stasher_file,您应该按如下方式完成

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};
Run Code Online (Sandbox Code Playgroud)

请注意stasher_file名称放在定义中的位置.


Bri*_*ndy 13

您正在使用指针newFile而不为其分配空间.

struct stasher_file *newFile = malloc(sizeof(stasher_file));
Run Code Online (Sandbox Code Playgroud)

您还应该将结构名称放在顶部.您指定stasher_file的位置是创建该结构的实例.

struct stasher_file {
    char name[32];
    int  size;
    int  start;
    int  popularity;
};
Run Code Online (Sandbox Code Playgroud)

  • @confuseKid:我建议你接受@ AndreyT的答案,他给出了错误来源的更好解释. (2认同)

Dir*_*irk 10

你是如何实际定义结构的?如果

struct {
  char name[32];
  int  size;
  int  start;
  int  popularity;
} stasher_file;
Run Code Online (Sandbox Code Playgroud)

将被视为类型定义,它缺少一个typedef.如上所述,您实际上定义了一个名为的变量stasher_file,其类型是一些匿名结构类型.

尝试

typedef struct { ... } stasher_file;
Run Code Online (Sandbox Code Playgroud)

(或者,正如其他人已经提到的):

struct stasher_file { ... };
Run Code Online (Sandbox Code Playgroud)

后者实际上匹配您对该类型的使用.第一种形式要求您删除structbefore变量声明.


Pet*_*umm 5

上面的案例是针对一个新项目.我在编辑一个完善的库的fork时遇到了这个错误.

typedef包含在我正在编辑的文件中,但结构却没有.

最终的结果是我试图在错误的地方编辑结构.

如果您以类似的方式遇到此问题,请查找编辑结构的其他位置并在那里进行尝试.