2014-10-09 38 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); 

如果你的程序是由多个翻译单位的,这样的声明通常放在头文件,其中包括在需要它们的每个翻译单元的最顶端。

并摆脱演员阵容。您在代码中使用的任何转换都不是必需的。它看起来像你添加这些强制转换尝试压制诊断消息,指出代码中的严重问题。