[英]warning: incompatible pointer types [-Wincompatible-pointer-types] in C
[英]Getting -Wincompatible-pointer-types for struct pointer warning when compiling
我正在跟随本教程学习 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;
我发现这只发生在 person 结构的next
指针中:
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;
}
哈希表的 output 是正确的,所以很明显它工作正常,但它会收到这些警告。 在实施链接技术之前,我没有收到这些警告。 我倾向于相信这与添加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;
匿名结构是没有标签的结构。 给你的结构一个标签,然后在任何地方使用struct person
。
并且不要为结构体的 typedefs 烦恼。 他们所做的只是让你不用在几个地方输入struct
,比如声明。
struct person {
char name[TABLE_SIZE];
int age;
//...
struct person *next;
};
...
struct person *tmp = hash_table[i];
另一方面,不采用 arguments 的函数应该用(void)
参数列表声明,否则它们表示未指定但固定的参数列表。 特别是,在 C 中,类似
int foo();
不是原型! 这是 C 没有void
关键字时的旧式 (K&R C) function 声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.