2011-07-26 99 views
4

由此產生的不兼容警告:Ç - 加載結構包含一個指針的指針

#include <stdlib.h> 
#include <stdio.h> 

typedef struct 
{ 
    int key; 
    int data; 
    struct htData_* next; 
    struct htData_* prev; 
}htData_; 

typedef struct 
{ 
    int num_entries; 
    struct htData_** entries; 
}ht_; 

ht_* new_ht(int num_entries); 
int ht_add(ht_* ht_p, int key, int data); 

int main() 
{ 
    int num_entries = 20; 
    //crate a hash table and corresponding reference                            
    ht_* ht_p = new_ht(num_entries); 
    //add data to the hash table                                 
    int key = 1305; 
    ht_add(ht_p,key%num_entries,20); 

    return 0; 
} 

ht_* new_ht(int num_entries) 
{ 
    ht_ *ht_p; 
    ht_ ht; 
    ht.num_entries = num_entries; 
    ht_p = &ht; 

    //create an array of htData                                 
    htData_ *htDataArray; 
    htDataArray = (htData_*) malloc(num_entries * sizeof(htData_)); 
    //point to the pointer that points to the first element in the array                       
    ht.entries = &htDataArray; // WARNING HERE!!!!!!!!!!!!!!!! 

    return ht_p; 
} 

我試圖複製**ptrstruct包含**ptr

更新:我的簡化代碼不準確,所以我發佈了實際的代碼。

+2

還提到,該線生產的警告 – iammilind

+0

什麼'htData_數組[20] = htDataArray;'打算做什麼? –

+0

我添加了一個更好,更容易理解的測試失敗案例,專門替換該行。感謝您的期待,併爲缺乏組織而表示歉意...... –

回答

4

的問題是,struct htData_htData_的一樣!就編譯器而言,struct htData_不存在 - 它是一種不完整的類型。另一方面,htData_對於匿名結構是typedef。有關更詳細的分析,請參見Difference between struct and typedef struct in C++

因此,您會收到警告,因爲ht.entries被宣佈爲struct htData_**類型,但該作業的右側有<anonymous struct>**類型。爲了解決這個問題,你需要定義struct htData_

typedef struct htData_ 
{ 
    ... 
} htData_; 
+0

+1,這是有用的信息 – iammilind

+0

這非常有幫助。感謝您的洞察力。 –

1

這條線是不正確:

htData_ array[20] = htDataArray; 

可以將指針不分配給數組。

在你編輯的代碼,這裏是有問題的行:

//point to the pointer that points to the first element in the array                       
    ht.entries = &htDataArray; 

其實,語法是正確的,所以它不應該給予警告。但你在這裏做錯了什麼。如果你想ht.entries指向數組的第一個元素比你需要將其申報爲,

htData_* entries; // 'struct' keyword not needed ahead of declaration 

並將其指定爲,

ht.entries = &htDataArray[0]; 
+0

如何使用該行的更新替換?我仍然遇到錯誤,但將**分配給相同類型的**是有意義的。 –

+0

如果ht.entries =&htDataArray,則仍會產生警告;由ht.entries =&htDataArray [0];取代。我誤解了你的評論嗎?此外,我不想只讓ht.entries指向數組中的第一個元素。我想要一個指向指向數組中第一個元素的指針的指針。更簡單地說,htDataArray指向數組中的元素0。我想指向htDataArray,它是一個**。 –

+0

@nick_name,你是否將聲明更改爲'htData_ * entries;'? – iammilind