43

我有一个结构定义为:

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。我究竟做错了什么?

4

6 回答 6

53

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

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

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

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

于 2010-04-05T01:49:29.527 回答
13

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

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

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

struct stasher_file {
    char name[32];
    int  size;
    int  start;
    int  popularity;
};
于 2010-04-05T01:45:13.483 回答
11

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

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

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

尝试

typedef struct { ... } stasher_file;

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

struct stasher_file { ... };

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

于 2010-04-05T01:50:09.680 回答
5

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

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

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

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

于 2011-05-11T19:27:23.623 回答
1

您收到该错误的原因是因为您已将您的声明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 终止。)

于 2010-04-05T01:52:38.603 回答
0

原因是您没有声明 type 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 ...

就这样。

于 2021-12-09T05:08:32.340 回答