我用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'是一个很好的讨论,但在这个帖子中是一个无关紧要的讨论。
----结束-编辑----
答案 0 :(得分:10)
更新:根据π的编辑,这个解释似乎是假的。但无论如何你可能会发现它很有趣。
在类C语言中,源代码中写为0
的指针值只是指定null pointer的约定。空指针是一个保证不指向任何对象的指针,它被定义为测试等于整数零,但它不需要具有与整数零相同的内部表示。空指针可以有多种表示形式,具体取决于体系结构,甚至指针的类型。
使用0
来表示“空指针”可能是一个不幸的约定;它引起的混乱程度可能最好用史蒂夫·萨米特关于这个主题的C programming language FAQ的长度来表示。
0
或NULL
)。这是C ++标准,第4.10节:
空指针常量是整数类型的整数常量表达式rvalue,其计算结果为零。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象或指向函数类型的指针的每个其他值区分开来。相同类型的两个空指针值应相等。
这保证您可以使用常量0
创建空指针,并通过与0
进行比较来测试指针是否为空,但是没有说明空指针的机器表示。 / p>
答案 1 :(得分:0)
完全可能你的this
指针没有指向正确的内存。如果您的程序表现出其他未定义的行为,那么这很可能只是随机垃圾内存。