我正在关注 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
。
因此 person
和 struct 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/