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

Cal*_*laf 11 c++ xcode qt 32bit-64bit

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

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

----开始,编辑----

我很感激在这些年后发现,当一个指针为指针指定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);
}
Run Code Online (Sandbox Code Playgroud)

如果我将上面的代码保存在'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'是一个很好的讨论,但在这个线程中是一个无关紧要的讨论.

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

Gar*_*ees 10

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


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

使用0意思是"空指针"也许是一个不幸的约定; 它引起的混乱程度可能最好用Steve Summit的C编程语言FAQ的长度表示.

我认为,hexa的评论证明了解这一惯例的难度.麻烦的是有三个想法要分开:

  • 空指针的概念:与指向任何对象的指针不同的指针.
  • 代表性的机器上一个空指针的(在某些情况下,由0x00000000地址,但是这不是你可以或应该依靠).
  • 如何在类C语言中创建测试空指针(通过使用像或的空指针常量).0NULL

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

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

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

  • 据我所知,在C++中,NULL总是为0.或者我错了? (3认同)