1
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 

为什么会出现这个问题?我编写的另一个守护程序运行良好。就在这种情况下,它会打印错误的值。

4

2 回答 2

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)
{
    ...
}
于 2012-11-13T06:48:31.740 回答
0

您是否在调用它的文件中声明了该函数。如果不是,编译器将假定它返回一个 int,您的代码会将 int 扩展为一个指针。

于 2012-11-21T03:26:32.460 回答