ProtobufCAllocator *kvs_pb_allocator()
{
static ProtobufCAllocator allocator;
//do something here
return &allocator; //print the address, it is 0x2aaaaafc12c0
}
在另一个程序中调用此函数(来自不同的文件):
ProtobufCAllocator *alloctor = kvs_pb_allocator();
//print the address, it is 0xffffffffaafc12c0
为什么会出现这个问题?我写的另一个守护程序工作正常。就在这种情况下,它会输出错误的值。
答案 0 :(得分:7)
您使用的是64位计算机,并且没有使用类型安全机制在第二个位置打印地址。该值被斩波为32位,然后符号扩展为64位。
0x00002aaa_aafc12c0
0xffffffff_aafc12c0
其中下划线表示值中间的32位边界。打印价值的方式比价值本身更容易出现问题。
您可以通过更仔细地打印地址来验证这一点。你可以使用:
printf("Address: %p\n", (void *)alloctor);
因为这是C。
我假设(可能没有理由)你有一个声明函数kvs_pb_allocator()
的标题,并且标题在你定义函数的文件和你调用它的文件中都使用。如果没有,那么进入确保所有函数在使用之前被声明(或者如果它们是静态函数时被定义)的规则。应在标题中声明所有外部函数。引用给定函数的所有代码都应使用声明该函数的单个头。这在C99和C2011中是必要的;如果你遇到C89编译器,你应该把自己的纪律强加于自己。
如果您使用GCC,您可以使用:
gcc -std=c99 -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition
获取警告。您的代码会收到旧式定义的警告,因为您应该定义:
ProtobufCAllocator *kvs_pb_allocator(void)
{
...
}
答案 1 :(得分:0)
您是否在您调用它的文件中声明了该函数。如果没有,编译器将假定它返回一个int,您的代码将int扩展为指针。