对于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;
}
对我来说,地址是0x7ffe9bce4a0c。另外,不仅要寻找作业答案,还要在这里提问,因为我的队友都没有发给我他们允许我们做的地址。研究了它,但找不到适合这种情况的答案,非常感谢您的帮助!
最佳答案
“如果我从两台不同的计算机上的VM中运行程序,内存地址将相同吗?”
不,当它们仅在同一环境和同一台机器上运行时,它们甚至可能会完全不同。没有什么比保证它具有相同的地址要好了。
现代OS会随意分配内存(当然在某些部分内)。
这有一个很好的理由:为了防止内存漏洞被黑客利用,黑客可能会使用它来破坏程序甚至操作系统。
此技术称为Address Space Layout Randomization。您可以here了解更多信息。
可能是变量在多次执行中可能具有相同的地址,但不能保证在下次运行时再次发生这种情况。实际上,如果操作系统支持ASLR,则很有可能“几乎保证”地址将不相等。
虚拟机不应对该行为产生任何影响。也许您应该在文档中阅读有关特定虚拟机的内存存储的更多信息(如果它支持ASLR),但是它应遵循相同的准则。
关于c - 如果我在两台不同的计算机上的VM中运行程序,内存地址是否相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61752426/