【发布时间】:2011-10-04 22:14:26
【问题描述】:
我用 64 位编译了 Qt。我的代码也是 64 位编译的。我将一个(指针)成员变量初始化为零。当我检查它时,XCode 告诉我它的值不是 0 而是 0xffffffff00000000。
这是 32 和 64 混淆的迹象吗?当库和我的代码都具有“g++ .. -arch x86_64 -Xarch_x86_64 ..”时,32 位初始化如何潜入可执行文件?以防万一,我在雪豹上。
----开始-编辑----
我很高兴在这么多年后发现,当将 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' 编译它,我会得到
此可执行文件中的指针使用 4 个字节。 此可执行文件中的零指针为 0x0如果我用 'g++ -arch x86_64 32_or_64.cpp' 编译它,我会得到
此可执行文件中的指针使用 8 个字节。 此可执行文件中的零指针为 0x0如果您认为这不能确定我的特定配置上的 0 不应该让我在 x86_64 中调试时准确地看到 0,请指出。否则,辩论 'null' 是一个精彩的讨论,但在此线程中无关紧要。
----结束编辑----
【问题讨论】:
-
您是否在调试优化的发布版本?如果是这样,调试器可能会感到困惑并且正在查看错误的位置。优化后的代码严重混淆了调试器。
-
不,构建是调试构建。成员变量由 Classname::Classname() : abc(0) {} 初始化。在成员函数 Classname::myfunction() 中我问 if(abc) {..} else {..},不应该像往常一样测试 abc(避免取消引用 abc,除非它已经设置)?谈论 abc(0) 在某些平台上将 abc 分配给纯 0x0000..0000 以外的任何东西让我感到非常惊讶。使用精确的零值的全部意义在于不能尽可能有效地测试指针是否为零,即不与某些预定义值进行比较?
-
这也可能是内存损坏的迹象。您是否使用 Guard Malloc 运行过您的程序?
标签: c++ xcode qt 32bit-64bit