簡體   English   中英

編譯時獲取結構指針警告的 -Wincompatible-pointer-types

[英]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

因此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;

匿名結構是沒有標簽的結構。 給你的結構一個標簽,然后在任何地方使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM