C:数组不获取新的内存地址

时间:2012-12-04 09:52:52

标签: c arrays pointers

运行以下内容时,它会继续打印相同的内存地址。

#include <stdio.h>

int array[5] = {2, 4, 6, 8, 10};
int *pointer;


int main()
{
        pointer = array;
        printf("%p:\t%d\n", pointer, *pointer);
        return 0;
}

我不知道这是否是一个问题,但我仍然很想知道为什么会这样,当在main()中声明它会继续返回新地址时。

4 个答案:

答案 0 :(得分:2)

纯粹是巧合。 您不能依赖地址在不同的运行中相同。

答案 1 :(得分:1)

请注意,在大多数现代桌面(当然还有服务器)操作系统上,进程处理的地址为virtual。这意味着当操作系统加载要在您的进程中运行的程序时,它会在RAM的物理页面和进程“看到”的虚拟页面之间建立映射。

每次运行程序时,这种映射似乎都是一样的,但这绝对是巧合。操作系统也可以应用随机化,或任何其他使映射变化的方法。

请注意,由于虚拟地址,任何数量的程序都可以同时运行 (并行)和仍然完全相同数组的地址。

答案 2 :(得分:0)

这个问题引起了很多争议,历史悠久。

最初,当程序在物理内存中运行时,事物的地址过去依赖于执行前内存中的内容。

稍后使用现代CPU,每个进程都会获得自己的地址空间,因此没有多样性。

然后,安全人员来了,并说程序起始地址和代码位置的故意随机化将阻止一系列安全攻击。他们中的一些人被一群软件工程师私刑,他们说改善一致性对于进行更有用的软件测试非常重要。然而,一些编译器(例如Visual Studio 2010)默认会对代码位置进行随机化。

在大多数情况下,数据仍然不可能且不太需要。这就是为什么你得到相同的结果。

答案 3 :(得分:0)

你通常在你发布的代码中为“数组”获得相同地址的原因,但是如果在main中声明数组,则得到不同的地址的原因是main之外的数组具有全局范围,因此在单个固定中分配如果在main中输入,则在main中声明的数组在堆栈中被分配(如果从其他地方调用main,则可以想象可以多次分配)。

其他答案中描述的随机化地址的安全功能适用于堆栈,而不适用于具有静态持续时间的变量,因为常见的漏洞通过使用恶意代码覆盖堆栈,然后通过覆盖返回地址跳转到它。也存储在堆栈中。使用恶意代码覆盖非堆栈变量仍会使攻击者无法执行它,因此安全问题也较少。