我有一个像这样编译的静态库:
ar rcs libd.a *.o
然后这个库针对另一个项目进行编译:
gcc *.c -ld
在库中有一个像这样的malloc调用。如果我打印该地址,它看起来像这样:
// In the libd.a
void *foo() {
void *ptr = malloc(size);
printf("malloc: %p\n", ptr);
return ptr;
}
输出:
malloc: 0x7fe3b3c04cd0
问题在于,当我调用此函数时,此地址被视为32位值,并且较高的部分被修剪。
代码:
//Outside the libd.a
void bar() {
void *ptr = foo(size);
printf("foo: %p\n", ptr);
}
输出:
foo: 0xffffffffb3c04cd0
如果注意,地址将被转移为32位地址,从而丢失其高位,并且由于b
前面有位1,因此该值被视为负数。
我是在OS X System, 10.10.5 Yosemite
,gcc -version
给出:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
答案 0 :(得分:3)
很可能用户代码缺少foo
的声明,因此编译器将其视为返回int
的非变量函数。没有gcc在未声明的功能上发出警告吗?