malloced指针在返回时更改值

时间:2015-07-07 01:53:47

标签: c

我的代码如下:

Foo* create(args) {
    Foo *t = malloc (sizeof (Foo)) ;
    // Fill up fields in struct t from args. 
    return t;
} 

电话是

Foo *created = create (args) 

请注意,该功能和对该功能的调用是两个独立的模块。 分配给t的{​​{1}}指针的值与malloc中捕获的指针略有不同。似乎地址的MSB已更改并替换为created。 LSB部分对于大约6-7个字符是相同的。

我不知道该怎么回事。 我正在使用GCC 4.6

1 个答案:

答案 0 :(得分:7)

您提供的最有可能的解释是,在调用时,函数create未声明的。许可的C编译器假设未知函数create返回int并生成代码,这有效地截断了指针值,或者更确切地说,将假定的int返回值符号扩展到MSB中接收器指针(假设指针在其位宽方面比int更宽的平台,例如64位平台)。

很可能编译器发出了关于调用未声明函数的警告,但是用户忽略了该警告。

确保create的声明(或更好的原型)在通话时可见。如果要在C99模式(或更高版本)下进行编译,请要求编译器严格执行C99要求。并且不要忽略编译器诊断消息。