“0xffffffff00000000”是否表示32位和64位编译之间的混淆?

时间:2011-07-13 22:58:28

标签: c++ xcode qt 32bit-64bit

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

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

---- BEGIN-编辑----

我很高兴在这些年后发现,当一个指针为指针分配0时,标准不会强加值0x00..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 %p\n", z);
}

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

Pointers in this executable use 4 bytes.
A zero pointer in this executable is 0x0

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

Pointers in this executable use 8 bytes.
A zero pointer in this executable is 0x0

如果您认为这不能确定我的特定配置上的0不应该让我在x86_64中调试时看到正好0,请指出它。否则,辩论'null'是一个很好的讨论,但在这个帖子中是一个无关紧要的讨论。

----结束-编辑----

2 个答案:

答案 0 :(得分:10)

更新:根据π的编辑,这个解释似乎是假的。但无论如何你可能会发现它很有趣。


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

使用0来表示“空指针”可能是一个不幸的约定;它引起的混乱程度可能最好用史蒂夫·萨米特关于这个主题的C programming language FAQ的长度来表示。

我认为,hexa的评论是难以理解这一惯例的证据。麻烦的是有三个想法要分开:

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

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

  

空指针常量是整数类型的整数常量表达式rvalue,其计算结果为零。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象或指向函数类型的指针的每个其他值区分开来。相同类型的两个空指针值应相等。

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

答案 1 :(得分:0)

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