为什么局部变量的地址每次都会不同?

2023-11-23

我询问了 Google 并在 StackOverflow 上做了一些研究。我的问题是,当我进入main()在C++程序中调用函数并声明第一个变量,为什么该变量的地址在不同的执行过程中会有所不同?请参阅下面我的示例程序:

#include <iostream>

int main() {
    int *a = new int;
    int *b = new int;

    std::cout << "address: " << a << " " << b << std::endl;
    std::cout << "address of locals: " << &a << " " << &b << std::endl;
    return 0;
}

执行1的结果:

address: 0xa32010 0xa32030
address of locals: 0x7fff10de2cf0 0x7fff10de2cf8

执行2的结果:

address: 0x1668010 0x1668030
address of locals: 0x7ffc252ccd90 0x7ffc252ccd98

执行3的结果:

address: 0x10e0010 0x10e0030
address of locals: 0x7ffd3d2cf7f0 0x7ffd3d2cf7f8

正如你所看到的,我在不同的执行中得到了不同的结果。输出的第一行对应于分配的内存的地址,这应该发生在堆中 - 如果每次都分配不同的地址,这对我来说有点有意义。然而,即使当我打印局部变量的地址(对应于第二行)时,结果仍然不同。

乍一看,我以为这是因为程序正在打印物理内存地址,但是这篇文章,虚拟内存或物理内存,反驳了我最初的想法。考虑到程序的执行是“相同的”,没有线程,没有用户输入等,是否有任何原因仍然存在不同地址的内存分配?

测试环境:

  • Linux 14.04
  • Mac OS X 10.10

在堆上分配时(使用new运算符或malloc()和朋友),你的程序必须要求操作系统分配你的堆内存。操作系统内存管理器中发生了很多幕后的事情(其实现细节大多超出了我的工资等级:垃圾收集、回收内存的整合等),它是一个好东西不必考虑它。

局部变量在堆栈上分配。传统上,堆栈分配是可重复的,但近年来这种情况发生了变化。地址空间布局随机化(ASR)是操作系统内存管理中相对较新的创新,它故意使堆栈分配中的内存地址(例如您所观察到的那些)在运行时尽可能具有不确定性。这是一个安全功能:这可以防止不良行为者利用堆缓冲区溢出,因为如果 ASLR 实现足够熵,谁知道溢出缓冲区的末尾会出现什么?

您为此和其他内存管理功能付出的代价是控制。在现代(非嵌入式)平台上对分配地址进行投注就像玩强力球:可能是一种有趣的干扰,但对于未来来说不是一个可行的计划。如果您的代码在 AVR-ISA 平台或类似平台上运行,那么赔率可能足够接近二十一点,以至于有人可能会被吸引去玩游戏以获胜(可以这么说)。

不管怎样,就我个人而言,我不是一个赌博者——正如我常说的,绅士们更喜欢堆栈分配。但这基本上就是您获得这些结果的原因。

感谢@T.C.获取链接,@SergeyA 获取建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么局部变量的地址每次都会不同? 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel

随机推荐

  • 在 Clojure 中将哈希映射翻过来

    我对 Clojure 很陌生 有一个有趣的问题想请教各位 Clojure 专家 我正在阅读 集体智能编程 一书 并尝试用 Clojure 编写示例 这本书中的示例全部用 Python 编写 在第一章中 我们有一个影评人的哈希图设置以及他们对
  • Spring Boot:从 url 中删除 jsessionid

    如何从我的网址中删除 jsessionid 我正在使用 Spring Boot MVC 没有 Spring Security 嵌入了 tomcat 我读到可以通过将disableUrlRewriting 设置为 true 来完成 但这看起来
  • 为什么我收到错误消息“‘AsyncThunkAction’类型上不存在属性‘then’”?

    我似乎无法收到Promise from createAsyncThunk函数来自Redux toolkit我对 Typescript 相当陌生 我正在努力弄清楚为什么它给了我Property then does not exist on t
  • 删除无关单元格时需要停止 UDF 重新计算

    我注意到每当我删除单元格时我的 UDF 都会重新计算 这会在删除整个列时导致大量延迟 因为 UDF 会为使用它的每个单元格调用 因此 如果您使用 1000 个 UDFS 则删除列或单元格将调用它 1000 次 例如 将以下 UDF 放入模块
  • Angular HTTP 拦截器 - 在多模块应用程序中显示微调器

    我正在尝试显示ng4 loading spinner用于对我的 API 进行 HTTP 调用的微调器 我的代码基于以下链接中的示例 https angular io guide http intercepting all requests
  • 从进程中删除管理员权限

    在这位伟大人物的帮助下MSDN 文章 我的第一个想法是简单地检查进程是否正在使用提升的管理员组 然后使用AdjustTokenGroups 我将管理员组设置为SE GROUP USE FOR DENY ONLY 但不幸的是 我们无法修改当前
  • iOS 9 通用链接无法从同一域启动应用程序

    我已设置 AASA JSON 文件以在有人访问时打开应用程序myDomain com ShowInTheApp 这适用于 Notes 应用程序 电子邮件 Gmail 应用程序 Safari 上的 Gmail 网络以及基本上除 myDomai
  • Excel ODBC 和 64 位服务器

    使用 ASP NET 我需要更新 Excel 模板 我们的服务器正在 64 位模式下运行 Windows 2008 我使用以下代码来访问 Excel 文件 string connection Provider MSDASQL Driver
  • 如何将 Row 类型转换为 Vector 以馈送到 KMeans

    当我尝试将 df2 提供给 kmeans 时 出现以下错误 clusters KMeans train df2 10 maxIterations 30 runs 10 initializationMode random 我得到的错误 Can
  • 错误:无法从静态上下文引用非静态方法“findViewById(int)”

    我正在使用 Android Studio Beta 在 onCreateView 中使用此 java 代码时 出现错误 ListView listView ListView findViewById R id someListView 这是
  • FFMPEG 在命令行中运行,但不在 PHP 中运行

    我正在使用 ffmpeg build for windows 来制作视频缩略图 该命令在命令行中运行良好 但在 PHP exec 方法中运行不佳 我使用 PHP 5 2 11 这是命令 E Documents and Settings x
  • 使用 Rhino-Mock 存根排序方法返回值

    我在阅读 Roy Osherove 的同时开始尝试 Rhino Mocks 3 6 单元测试的艺术 他有一个示例 演示了可以编写模拟方法的脚本 以便在使用相同参数调用两次时返回不同的结果 Test public void ReturnRes
  • 多次调用 thread.timer()

    代码 from threading import Timer import time def hello print hello a Timer 3 hello a start time sleep 4 a start 运行此脚本后 我收到
  • 错误:原因:无法找到请求目标的有效证书路径

    当我同步 gradle 时 我在 android Studio 2 2 3 中收到以下错误 错误 原因 无法找到请求目标的有效证书路径 我该如何解决这个问题 我也在添加我的 Gradle 文件 apply plugin com androi
  • 在临时字符串上使用 string::c_str [重复]

    这个问题在这里已经有答案了 关于临时对象何时被销毁 这是否有效 FILE f fopen std string my path c str r 在评估第一个参数后 临时对象是否会立即被销毁fopen或之后fopen call 使用以下代码进
  • 方便地移动列

    关于如何将列移动到第一个或最后一个位置有很多很好的问题和答案 Using dplyr最佳答案分别类似于 iris2 lt iris gt head 2 iris2 gt select Sepal Width everything move
  • 在命名元组列表中建立索引并查找值

    我有一个如下所示的命名元组 tup myTuple a b c 其中 可以是任何值 字符串 数字 日期 时间等 现在 我列出了这些命名元组并想要找到 假设 c 1 以及 a 和 b 的相应值 有没有Pythonic的方法可以做到这一点 使用
  • 字体大小独立的 UI:当我切换到 120 DPI 时一切都崩溃了?

    因此 我正在阅读有人在另一个问题中链接到的 Windows Vista UI 指南 他们提到您应该能够在切换到 120 DPI 后继续生存 好吧 我启动了安装了应用程序的便捷虚拟机 然后我们得到了什么 啊啊啊 大规模用户界面失败 一切都杂乱
  • 将一个输入文件与给定数量的文件进行匹配的算法

    我上周去面试了 我被算法回合中的一个问题困住了 我回答了这个问题 但面试官似乎并不相信 这就是为什么我分享同样的内容 请告诉我这个问题有什么优化的方法 以便对我以后的面试有帮助 Question 给出了 20 个文本文件 所有文件都是 AS
  • 为什么局部变量的地址每次都会不同?

    我询问了 Google 并在 StackOverflow 上做了一些研究 我的问题是 当我进入main 在C 程序中调用函数并声明第一个变量 为什么该变量的地址在不同的执行过程中会有所不同 请参阅下面我的示例程序 include