"0xffffffff00000000"是否表明 32 位和 64 位编译之间混淆了?

Is "0xffffffff00000000" an indication of a mix-up between 32-bit and 64-bit compilations?

本文关键字:之间 编译 是否 0xffffffff00000000 位和      更新时间:2023-10-16

我编译了64位的Qt。我的代码也是用64位编译的。我将一个(指针)成员变量初始化为0。当我检查它时,XCode告诉我它的值不是0,而是0xffffff00000000。

这是32和64之间混淆的标志吗?当库和我的代码都有"g++ .."时,32位初始化是如何悄悄进入可执行文件的?-Xarch_x86_64 .."?如果这很重要,我在雪豹上。

——Begin-Edit

我很感激这么多年后发现标准没有强制值0x00..当指针赋值为0时,则为00,但在本例中这不是问题。

#include <stdio.h>
int main()
{
    const char * c = "Foo";
    printf("Pointers in this executable use %lu bytes.n", sizeof(c));
    void * z = 0;
    printf("A zero pointer in this executable is %pn", z);
}

如果我将上面的代码保存在'32_or_64.cpp'中,然后使用'g++ -arch i386 32_or_64.cpp'编译它,我得到

<>之前这个可执行文件中的指针使用4个字节。这个可执行文件中的零指针是0x0之前

如果我用'g++ -arch x86_64 32_or_64.cpp'编译它,我得到

<>之前这个可执行文件中的指针使用8个字节。这个可执行文件中的零指针是0x0之前

如果您认为这并不能说明我的特定配置上的0不应该让我在x86_64中调试时精确地看到0,请指出来。否则,讨论'null'是一个很好的讨论,但在这个主题中是不相关的。

——End-Edit

更新:鉴于π的编辑,这个解释似乎是虚假的。但你可能会觉得它很有趣。


在类c语言中,源代码中写为0的指针值只是指定空指针的约定。空指针是一种保证不指向任何对象的指针,它被定义为test等于整数0,但它不需要具有与整数0相同的内部表示。空指针可以有多种表示形式,这取决于体系结构,甚至取决于指针的类型。

使用0表示"空指针"可能是一个不幸的约定;它所引起的混乱程度也许最好地体现在Steve Summit关于这个主题的C编程语言常见问题解答的长度上。

我认为,

hexa的评论证明了理解这种惯例的困难。问题是有三个想法要分开:

  • 空指针的概念:与指向任何对象的指针不同的指针。
  • 机器上空指针的表示(在某些情况下通过地址0x00000000,但这不是你可以或应该依赖的东西)。
  • 如何在类c语言中创建测试空指针(通过使用空指针常量,如0NULL)

这是c++标准,第4.10节:

空指针常数是整型的整型常量表达式右值,其值为0。空指针常量可以转换为指针类型;结果是该类型的空指针值,该值与指向对象类型的指针或指向函数类型的指针的其他值不同。两个相同类型的空指针值比较时必须相等。

这保证了您可以使用常量0创建空指针,并通过与0的比较来测试指针是否为空,但没有说明空指针的机器表示。

很可能您的this指针没有指向正确的内存。如果您的程序显示出其他未定义的行为,那么很可能这只是随机的垃圾内存。

相关文章: