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

Posted

技术标签:

【中文标题】C 编程:取消引用指向不完整类型错误的指针【英文标题】:C programming: Dereferencing pointer to incomplete type error 【发布时间】:2011-02-04 07:33:53 【问题描述】:

我有一个结构定义为:

struct 
 char name[32];
 int  size;
 int  start;
 int  popularity;
 stasher_file;

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

struct stasher_file *files[TOTAL_STORAGE_SIZE];

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

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

我收到以下错误:

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

每当我尝试访问newFile 中的成员时。我做错了什么?

【问题讨论】:

感谢大家的帮助:) 顺便说一句,我也遇到了同样的错误,但问题是我没有包含特定的头文件(在一个大项目中)。 【参考方案1】:

您正在使用指针newFile,但没有为其分配空间。

struct stasher_file *newFile = malloc(sizeof(stasher_file));

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

struct stasher_file 
    char name[32];
    int  size;
    int  start;
    int  popularity;
;

【讨论】:

如何为其分配空间? 我没有为newFile分配空间,而是把stasher_file的定义改成和你的一样,没有报错。我还需要分配空间吗? @confuseKid:是的,你需要像我给的那样分配空间。还要确保在完成后释放它。 @confuseKid:我建议你接受@AndreyT 的回答,他对错误的来源给出了更好的解释。 我相信实际提出的问题是“我做错了什么?”,所以这是一个更完整的答案。【参考方案2】:

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

为了定义struct stasher_file,你应该这样做

struct stasher_file 
 char name[32];
 int  size;
 int  start;
 int  popularity;
;

注意stasher_file 名称在定义中的位置。

【讨论】:

+1 比我快,并且使用struct stasher_file 而不是typedef 与示例中OP 对类型的使用一致。【参考方案3】:

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

struct 
  char name[32];
  int  size;
  int  start;
  int  popularity;
 stasher_file;

将被视为类型定义,它缺少typedef。像上面写的那样,你实际上定义了一个名为stasher_file的变量,它的类型是一些匿名结构类型。

试试

typedef struct  ...  stasher_file;

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

struct stasher_file  ... ;

后者实际上与您对类型的使用相匹配。第一种形式要求您在变量声明之前删除struct

【讨论】:

【参考方案4】:

您收到该错误的原因是您已将 struct 声明为:

struct 
 char name[32];
 int  size;
 int  start;
 int  popularity;
 stasher_file;

这不是声明stasher_file 类型。这是声明一个匿名 struct 类型并创建一个名为 stasher_file 的全局实例。

你的意图是:

struct stasher_file 
 char name[32];
 int  size;
 int  start;
 int  popularity;
;

但请注意,虽然 Brian R. Bondy 对您的错误消息的回答不正确,但他是对的,您尝试写入 struct 却没有为其分配空间。如果你想要一个指向struct stasher_file 结构的指针数组,你需要调用malloc 来为每个结构分配空间:

struct stasher_file *newFile = malloc(sizeof *newFile);
if (newFile == NULL) 
   /* Failure handling goes here. */

strncpy(newFile->name, name, 32);
newFile->size = size;
...

(顺便说一句,使用strncpy 时要小心;不能保证NUL 终止。)

【讨论】:

如果您将结构定义为 typedef struct ... stasher_file;那么你可以使用 malloc 作为 stasher_file *newFile = malloc(sizeof (stasher_file); @katta 是的,但很多人认为改用T* p = malloc(sizeof *p) 是一种更好的做法。这样,如果 p 的类型发生变化,您只需更新其声明,而不是 malloc 站点。忘记更新malloc 站点会默默地分配错误的内存量,可能导致缓冲区溢出。 @katta 另见***.com/questions/373252/…【参考方案5】:

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

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

最终结果是我试图在错误的位置编辑结构。

如果您以类似的方式遇到这种情况,请查找编辑结构的其他地方并在那里尝试。

【讨论】:

【参考方案6】:

原因是你没有声明类型struct stasher_file,你定义了一个struct变量stasher_file

C中,结构声明:

    struct structure-tag 
        member1
        member2
        ...
    ;

structure-tag 是关键字struct 之后的可选名称。 声明后,您可以定义一个变量:

    struct structure-tag var1, *var2;

此外,您可以同时进行声明和定义,例如:

    struct structure-tag 
        member1
        member2
        ...
     var1, *var2;

所以在你的情况下,你可以试试这个:

struct stasher_file 
 char name[32];
 int  size;
 int  start;
 int  popularity;
 *files[TOTAL_STORAGE_SIZE];

struct stasher_file *newFile = malloc(sizeof(struct stasher_file));

... other code ...

就是这样。

【讨论】:

以上是关于C 编程:取消引用指向不完整类型错误的指针的主要内容,如果未能解决你的问题,请参考以下文章

使用 strcmp 取消引用指向不完整类型错误的指针 [关闭]

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

取消引用从线程原因返回的指针;分段错误:11 [重复]

typedef struct 导致“不允许指向不完整类型的指针”错误

在 C 中取消引用指向 0 的指针

删除时出错:表达式必须是指向完整对象类型的指针