什么时候64位指针在64位机器上只使用低32位?

时间:2015-02-03 03:01:09

标签: c pointers gcc 32bit-64bit

背景

我有以下简单的代码段:

Object * copied_object = get_result(original_object);

其中get_result()是返回指针的东西(在64位机器上应该是64 pinter)。我明白,如果我不在这里声明get_result(),gcc默认会返回该函数的int,因此result将包含一个截断的指针(只剩下32位) - 我有一个sig11错误,因为这个问题。

然而,当我运行我的程序时,我的错误似乎是不确定的出现:我只在第一次点击它(我把这个逻辑放在一个循环中,每次我从命令行发送一个信号,上面代码片段将被执行;我有一个信号处理程序,所以sig11没有崩溃我的程序)。调试后我发现在以下时间从函数本身返回的指针只使用低32位(即使像original_object这样的指针也只使用低32位) - 因此截断不会导致任何问题

问题

我的问题是,在什么条件下我们只使用64机器中指针的低32位?分配指针的模式是什么?

感谢任何帮助,或者非常欢迎一些参考。

2 个答案:

答案 0 :(得分:1)

这取决于操作系统以及程序的链接方式。但是用户模式程序几乎总是在虚拟内存的下半部分运行。另一方面,内核映射到地址空间的上半部分。

此外,大多数程序往往链接在0x400000的基址,所以如果它们不是太大,大多数指针将在32位指针内。 Linux上的许多共享库最终会映射得更高。

答案 1 :(得分:0)

取决于。您可以使用无符号的32位整数正确地寻址前4 GiB内存。但是,如果函数没有定义原型,调用者将期望它返回一个 signed 整数,它可以寻址2 GiB的低内存和2 GiB的高内存(假设2' s补码签署int)。
是否可以解决任何特定对象的问题更复杂,因为C语言并不强制要求地址,除了您需要能够计算刚刚经过任何有效对象的地址。当然,如果您要截断指针,这不起作用 鉴于现代操作系统/加载器故意将地址空间随机化以抵御安全漏洞,如果您希望它以64位模式运行,您应该绝对确保程序64位清理。如果不能,请坚持使用32位模式(如果适用)。