c - 编译时获取结构指针警告的 -Win兼容指针类型

标签 c struct declaration typedef compiler-warnings

我正在关注 this了解 C 中哈希表中的外部链接的教程。我发现使用 gcc --std=c99 编译时出现以下错误:

warning: assignment to "person *" {aka 'struct <anonymous> *'} from incompatible pointer type 'struct person *' [-Wincompatible-pointer-types]
101 | tmp = tmp->next;

warning: assignment to "person *" {aka 'struct <anonymous> *'} from incompatible pointer type 'struct person *' [-Wincompatible-pointer-types]
112 | p->next = hash_table[index];

warning: assignment to "person *" {aka 'struct <anonymous> *'} from incompatible pointer type 'struct person *' [-Wincompatible-pointer-types]
121 | tmp = tmp->next;

warning: assignment to "person *" {aka 'struct <anonymous> *'} from incompatible pointer type 'struct person *' [-Wincompatible-pointer-types]
132 | tmp = tmp->next;

warning: assignment to "person *" {aka 'struct <anonymous> *'} from incompatible pointer type 'struct person *' [-Wincompatible-pointer-types]
136 | hash_table[index] = tmp->nxt;

我发现只有 next 才会出现这种情况person 结构体的指针:

typedef struct {
   char name[TABLE_SIZE];
   int age;
   //...
   struct person *next;
} person;

对于这样的函数:

void print_table(){
   for (int i=0; i < TABLE_SIZE; i++0 {
       if (hash_table[i] == NULL) {
           printf("\t%i\t---n\n",i);
       }
       else {
            printf("\t%i\t",i);
            person *tmp = hash_table[i];
            while (tmp != NULL) {
                printf("%s -", tmp->name);
                tmp = tmp->next;
            }
            printf("\n");
       }
   }
}

bool hash_table_insert(person *p) {             
    if (p == NULL) return false;                
    int index = hash(p->name);
    p->next = hash_table[index];
    hash_table[index] = p;
    return true; 
}

哈希表的输出是正确的,所以显然它工作正常,但它收到了这些警告。在实现链接技术之前我没有收到这些警告。我倾向于相信这与添加 struct person *next; 有关。 ,或者至少是用法。有什么想法吗?

最佳答案

这个 typedef 声明

typedef struct {
   char name[TABLE_SIZE];
   int age;
   //...
   struct person *next;
} person;

使用 typedef 名称 person 声明一个未命名结构,并且此记录位于未命名结构内

   struct person *next;

引入不完整的类型说明符struct person

因此 personstruct person 是两个不同的类型说明符。

例如,你可以

typedef struct person person;

struct person {
   char name[TABLE_SIZE];
   int age;
   //...
   struct person *next;
};

typedef struct person {
   char name[TABLE_SIZE];
   int age;
   //...
   struct person *next;
} person;

关于c - 编译时获取结构指针警告的 -Win兼容指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73509189/

相关文章:

JavaScript语言解析: Distinguish function expressions and declarations

c - 使用 read() 并将缓冲区放入字符串中

c - 查找某个文件的所有硬链接(hard link)

c - 将结构用作 c "namespace"的缺点

c - 如何正确分配字符串结构数组

r - R 中参数长度为零的声明

c - 与 C 中的指针混淆

c - Qt Creator ClangCodeModel 无法解析或自动完成条件嵌套包含?

c - 使用先前声明的数组初始化结构

c++ - 声明、定义和调用