"0xffffffff00000000"是否表明 32 位和 64 位编译之间混淆了?
Is "0xffffffff00000000" an indication of a mix-up between 32-bit and 64-bit compilations?
我编译了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语言中创建和测试空指针(通过使用空指针常量,如
0
或NULL
)
这是c++标准,第4.10节:
空指针常数是整型的整型常量表达式右值,其值为0。空指针常量可以转换为指针类型;结果是该类型的空指针值,该值与指向对象类型的指针或指向函数类型的指针的其他值不同。两个相同类型的空指针值比较时必须相等。
这保证了您可以使用常量0
创建空指针,并通过与0
的比较来测试指针是否为空,但没有说明空指针的机器表示。
很可能您的this
指针没有指向正确的内存。如果您的程序显示出其他未定义的行为,那么很可能这只是随机的垃圾内存。
- 热键/按钮,根据需要进行编译,但不运行(在F5和Ctrl+Shift+B之间)
- MSVC 2010 编译应用程序和 MSVC 2019 编译应用程序之间的行为差异
- C++ 编译时在两个变量之间交替
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 为什么 GCC 和 clang 之间编译的 c++17 lambda 存在差异?
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- Visual Studio 2015:在远程编译(在Raspberry上)和本地编译(在Windows上)之间切换
- 使用运行时参数与编译时参数在类之间共享代码
- C++编译错误(有符号和无符号整数表达式之间的比较)
- C++编译错误是由于使用 std::move 时运动构造函数与其他非运动构造函数之间的冲突
- 根据编译时条件在类型之间选择类型的惯用方法
- 结构成员的地址作为编译时间常数之间的差异
- 我的编译行和我的生成文件之间的区别可能导致错误
- 预编译的头文件和预编译的二进制文件之间的区别是什么
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 编译单元之间共享的全局常量对象
- 编译一个相当简单的c++11程序时,gcc和clang之间的结果不同
- 使用编译代码和 PHP 加速器来提高性能之间的差异
- 编译宏以测试uint64_t和无符号长整型之间的差异
- 2个c源文件之间的函数指针操作导致编译时错误