c - 如果我从两台不同的计算机在 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。也不仅仅是在寻找家庭作业的答案,而是在这里问,因为我的队友都没有向我发送他们被允许做的地址。已经研究过,但找不到与这种情况相匹配的答案,非常感谢您的帮助,谢谢!
解决方案
“如果我在两台不同计算机上的虚拟机中运行程序,内存地址会相同吗? ”
不,当仅在同一环境和同一台机器上运行时,它们甚至可能不一样。没有什么比保证它具有相同的地址更重要的了。
现代操作系统任意分配内存(当然在某些部分内)。
这有一个很好的理由:为了防止黑客利用内存漏洞来破坏程序甚至操作系统。
这种技术称为地址空间布局随机化。你可以在这里阅读更多关于它的信息。
变量可能在多次执行中具有相同的地址,但不能保证这种情况会再次发生,已经在下一次运行中发生。事实上,如果操作系统支持 ASLR,则更有可能存在地址不相等的“几乎保证”。
虚拟机不应影响该行为。也许你应该阅读更多关于你的特定虚拟机的内存存储的文档(如果它支持 ASLR),但它应该遵循相同的指导方针。
推荐阅读
- python - Django测试找不到现有的数据库表
- sql - “表达式不正确或太复杂”
- shopware - 在 Shopware 中编辑主页
- java - 蛇类命名约定
- java - com.google.common.collect.Iterables 和实例类型
- apache-spark - SparkSQL 在窗口规范中没有正确排序
- android - Android 中 5 秒后的 Toast 消息
- highcharts - Highcharts 注释 - 如何按轴点绘制矩形?
- pyspark - 在 pyspark 中创建训练集和测试集时,如何跨不同组进行分层抽样?
- gradle - 在 IntelliJ 上运行 Corda 项目