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 取消引用指向不完整类型错误的指针 [关闭]