2014-09-28 119 views
0

我不理解對我的代碼的警告。這似乎很簡單,但我簡單不明白。這是有問題的代碼:關於不兼容的指針類型的警告

chunk* findChunk(chunk *ptr, int size) 
{ 
    ... 
    chunk *newNode = ptr->end + size; 
    ... 
} 

塊是我剛纔所定義的結構:

typedef struct chunk 
{ 
    int size; 
    int available; 
    struct chunk* next; 
    char end[1]; 
} chunk; 

這是警告我收到:

warning: initialization from incompatible pointer type [enabled by default]<br> 
chunk *newNode = ptr->end + size; 

我不能我明白,newNode和ptr是相同的類型。我錯過了什麼?感謝你們。

+0

'newNode'和'ptr'屬於同一類型,但'ptr-> end + size'(與'ptr-> end'類型相同)是'char *'類型。 – mafso 2014-09-28 12:44:12

回答

4

將兩個已聲明指向不同類型的指針等同時,會出現不兼容的警告類型。這是允許的,因爲也許你作爲編碼人員知道它會起作用,但通常不會,這就是爲什麼你會收到警告。

在您的代碼,您已經定義了結構的end字段設置爲1x1的字符數組其類型爲char *,但在你的第一個片段,你想用chunk *等同起來。從您的代碼看起來,您可能的意思是使用next而不是end

此外,我強烈勸阻使用指針添加整數,除非您完全確定自己在做什麼。即使如此,也許有更安全,更好的方法來實現你想要的任何事情。

此外,爲什麼你創建一個單個元素的字符數組?這對我來說似乎很奇怪。

+2

它是一個pre-c99 pre gnu struct hack – 2014-09-28 04:24:00

+0

這是不允許的,這是違反約束的。編譯器必須投訴並可能拒絕編譯。該轉換需要強制轉換。指針算術有什麼問題? – mafso 2014-09-28 11:58:56

+0

我想實現malloc函數,用鏈表管理可用(空閒)內存。用戶需要一些內存,但我的塊大於要求的內存。所以在這段代碼中,我試圖將這個節點分成兩部分。我不知道這個解釋是否清楚。我只是希望進一步提供新的節點,所以我可以分解它。但我得到了你所說的,謝謝你的迴應。 char end [1]只是爲了標記元數據的末尾(它在實際的內存分配之前)。 – 2014-09-28 20:02:24

相關問題