我的代码如下:
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
答案 0 :(得分:7)
您提供的最有可能的解释是,在调用时,函数create
是未声明的。许可的C编译器假设未知函数create
返回int
并生成代码,这有效地截断了指针值,或者更确切地说,将假定的int
返回值符号扩展到MSB中接收器指针(假设指针在其位宽方面比int
更宽的平台,例如64位平台)。
很可能编译器发出了关于调用未声明函数的警告,但是用户忽略了该警告。
确保create
的声明(或更好的原型)在通话时可见。如果要在C99模式(或更高版本)下进行编译,请要求编译器严格执行C99要求。并且不要忽略编译器诊断消息。