2014-10-09 62 views
-2

我有這樣一段代碼:的malloc:投給指針從不同大小的整數[-Wint到指針鑄]

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

typedef struct tToken 
{ 
    tState state;    //stav lexemu 
    char *data;    //hodnota lexemu 
    int row;    //radek lexemu 
    int column;   //sloupec lexemu 
}tToken; 

tToken token; 

... 

void *gcMalloc(int dataSize){ 
    ... 
    void *AllocatedData = (void*)malloc(dataSize); 
    return AllocatedData; 
} 

... 

if(token.data == NULL) 
    token.data = (char *) gcMalloc(sizeof(char)); //there is the problem 

但錯誤

警告:投給來自不同大小整數的指針[-Wint-to-pointer-cast]

仍然存在...有人可以解釋我爲什麼嗎?以及如何改變它?

+3

您需要'#include '來使用'malloc'。 (我假設警告是在'malloc'調用的,如果沒有,請更新你的問題。)我確定這是重複的,但我懶得跟蹤它。 – 2014-10-09 21:27:57

+0

編輯:)你可以看看它嗎? – 2014-10-09 21:30:34

+0

聲明'gcMalloc'在哪裏?可能你需要爲任何頭文件聲明它添加一個'#include'指令。 (並且不要將'malloc'或'gcMalloc'的結果強制轉換爲'void *',而是將'void *'值隱式轉換爲目標指針類型。轉換是不必要的,並且可以屏蔽錯誤) – 2014-10-09 21:32:08

回答

3

我的猜測是您發佈的代碼並不能準確地代表您的翻譯單元(或單元)的真實結構。顯然,實際上你的gcMalloc函數要麼是在之後定義的,而是要對它進行調用,或者甚至在不同的翻譯單元中定義。

同時,在呼叫

token.data = (char *) gcMalloc(sizeof(char)); 

gcMalloc的函數的點是完全未知的(未聲明的,沒有定義),這使得編譯器假定它返回int。因此,有關試圖將32位int值轉換爲char *類型的64位指針的警告。

您必須確保您的gcMalloc功能是宣稱,然後再嘗試調用它。這是你的gcMalloc的聲明可能是什麼樣子

void *gcMalloc(int dataSize); 

如果你的程序是由多個翻譯單位的,這樣的聲明通常放在頭文件,其中包括在需要它們的每個翻譯單元的最頂端。

並擺脫演員陣容。您在代碼中使用的任何轉換都不是必需的。它看起來像你添加這些強制轉換嘗試壓制診斷消息,指出代碼中的嚴重問題。