首页 > 解决方案 > 如果我从两台不同的计算机在 VM 中运行程序,内存地址会相同吗?

问题描述

对 C 语言相当陌生,我了解到地址取决于操作系统和 CPU 等一些因素。我的一门 C 课程有一个实验室,询问我们是否运行程序并打印出每个变量的地址,它们是否具有与另一个学生相同的地址和值(完全相同的程序)。它们是局部变量,存储在堆栈中。通常我会说不,但我们所有人都必须通过 ssh 连接到我们大学的实验室,并且我们的程序在具有相同规格的同一台机器上运行。这就是我感到困惑的地方,很确定这些值是相同的,但是,我不知道究竟是什么决定了这些地址。这是程序中的一段代码:

int g2(int a, int b)
{
 int c = g1(a + 3, b - 11);
 printf("g2: %d %d %d \n", a,b,c);
 printf("a's address is %p b's address is %p C's address is %p\n", &a, &b, &c);
 return c - b;
}

对我来说,a 的地址是 0x7ffe9bce4a0c。也不仅仅是在寻找家庭作业的答案,而是在这里问,因为我的队友都没有向我发送他们被允许做的地址。已经研究过,但找不到与这种情况相匹配的答案,非常感谢您的帮助,谢谢!

标签: cmemoryvirtual-machinevirtualizationmemory-address

解决方案


如果我在两台不同计算机上的虚拟机中运行程序,内存地址会相同吗?

不,当仅在同一环境和同一台机器上运行时,它们甚至可能不一样。没有什么比保证它具有相同的地址更重要的了。

现代操作系统任意分配内存(当然在某些部分内)。

这有一个很好的理由:为了防止黑客利用内存漏洞来破坏程序甚至操作系统。

这种技术称为地址空间布局随机化你可以在这里阅读更多关于它的信息。


变量可能在多次执行中具有相同的地址,但不能保证这种情况会再次发生,已经在下一次运行中发生。事实上,如果操作系统支持 ASLR,则更有可能存在地址不相等的“几乎保证”。

虚拟机不应影响该行为。也许你应该阅读更多关于你的特定虚拟机的内存存储的文档(如果它支持 ASLR),但它应该遵循相同的指导方针。


推荐阅读