为什么分配单个字节时地址不连续?

2023-12-24

我动态分配内存如下:

char* heap_start1 = (char*) malloc(1);
char* heap_start2 = (char*) malloc(1);

当我如下执行 printf 时,令人惊讶的是地址不是连续的。

printf("%p, %p \n",heap_start1,heap_start2);

Result:

   0x8246008, 0x8246018

正如您所看到的,有 15 字节的额外内存未进行碎片整理。这绝对不是因为单词对齐。这种特殊排列背后有什么想法吗?

提前致谢!

如果这很重要的话,我在Linux中使用gcc。


glibc's malloc,对于小于 16 字节的小内存分配,只需将内存分配为 16 字节。这是为了防止释放该内存时出现外部碎片,其中空闲内存块太小而无法在一般情况下用于满足新的要求malloc运营。

分配的块malloc还必须足够大,以便在存储空闲块的数据结构中存储跟踪它所需的数据。

这种行为在增加内部碎片的同时,也减少了整个系统的整体碎片。

Source: http://repo.or.cz/w/glibc.git/blob/HEAD:/malloc/malloc.c http://repo.or.cz/w/glibc.git/blob/HEAD:/malloc/malloc.c(特别阅读第108行)

/*
...
Minimum allocated size: 4-byte ptrs:  16 bytes    (including 4 overhead)
...
*/

此外,返回的所有地址mallocglibc 中的调用与以下内容对齐:2 * sizeof(size_t)字节。对于 32 位系统(例如您的系统)来说是 64 位,对于 64 位系统来说是 128 位。

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

为什么分配单个字节时地址不连续? 的相关文章

随机推荐

  • Go 是否可以在不为每个外部进程启动一个操作系统线程的情况下生成并与外部进程通信?

    简洁版本 Golang 是否可以生成多个外部进程 shell 命令 在平行下 这样它就不会启动一个操作系统线程每个外部进程 并且在完成后仍然能够接收其输出 更长的版本 在 Elixir 中 如果使用端口 则可以生成数千个外部进程 而无需真正
  • 如何删除/修复幽灵工作区

    不知何故 我最终得到了一个 幽灵 工作空间 它不会显示在 Visual Studio 中的 管理工作区 下 当我连接到 VS Team Services 和开源控件资源管理器时 它会弹出一个错误对话框 其中包含 TF14061 工作区不存在
  • C++ 对字符文字的顺序有何保证?

    C 对字符文字的顺序有何保证 中的字符有一定的顺序吗基本源字符集 例如是 a lt z 保证是真的吗 怎么样 A lt z 该标准仅提供十进制数字排序的保证0 to 9 来自 C 11 标准草案部分2 3 lex charset 在源和执行
  • OpenCV Sift/Surf/Orb:drawMatch 函数无法正常工作

    我使用 Sift Surf 和 ORB 但有时我在使用 drawMatch 函数时遇到问题 这里的错误 OpenCV 错误 drawMatches 中断言失败 i2 gt 0 i2 0 i2 代码 drawMatchPoints img1
  • ISR 和函数调用之间的区别?

    我想了解ISR 中断服务例程 和函数调用之间的区别 我觉得从硬件角度来看 函数调用和 ISR 是相同的 如果我错了 请纠正我 我能找到的有关 ISR 和函数调用的所有信息如下 ISR 执行过程中随时可能发生的异步事件 该程序 将 PC 标志
  • 等待操作超时 Win32Exception (0x80004005): 等待操作超时 azure

    从 sql azure 检索大量数据时出现以下错误 我已经实现了瞬态故障处理 但仍然收到此错误 描述 执行当前 Web 请求期间发生未处理的异常 请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息 异常详细信息 System Comp
  • 使用 shellcode 进行缓冲区溢出练习

    我正在做一个关于 C 程序上的缓冲区过载的练习 这个问题的目标是在我将 shellcode 插入到程序中后获取 root shell 这是我到目前为止所拥有的 步骤 1 首先 让我们看看文件中的 C 代码file c root kali c
  • 自动创建 IIS 6.0 网站 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有 Web 应用程序门户 其中托管多个应用程序 每个应用程序都有自己的 IIS 网站 因此 每次我
  • 如何使用 NDK 19 在 OSX Darwin 上交叉编译适用于 64 位 Android 的 OpenSSL

    我之前问过基本相同的问题 不同的 NDK here https stackoverflow com questions 54537033 how to build openssl 1 1 1 for 64 bit android using
  • 在 Java 中合并 2 个 PDF

    我在使用 iText 以及将 2 个 PDF 合并为 1 个 PDF 时遇到问题 我想合并这个 PDF PDF1 一个站点 这是 PDF1 PDF2 一个站点 这是PDF2 我需要的 https dl dropboxusercontent
  • 为什么any 扩展X ? A : B 给 A |打字稿中的 B?

    type TestAny any extends a 1 2 gt 1 2 why how to understand type TestUnknown unknown extends a 1 2 gt 2 type TestStringA
  • ipython 中的括号匹配

    IPython 中是否有自动关闭方括号 引号 圆括号等的选项 我希望有一个与 gedit 插件类似的功能 根据建议 通过调整 inputrc 可以让应用程序 包括 IPython 使用 readline 在输入左括号时自动添加右括号here
  • 事件溯源命令或来自外部系统的事件?

    在大多数情况下 我了解 CQRS ES 系统中命令和事件之间的区别 然而 有一种情况我想不通 假设我正在构建一个个人财务跟踪系统 用户可以在其中输入借方 贷方 显然 这些是命令 一旦经过验证 域模型就会更新并发布事件 然而 假设信用 借记信
  • LinearLayout$LayoutParams 无法转换为 android.widget.FrameLayout$LayoutParams

    解释和解决方法在底部 我正在开发一个滑块布局动画 动画工作正常 但当所有进程结束时 它们会出现下一个异常 I guess RelativeLayout家长有事情要做 但我不知道如何解决 09 06 11 24 58 952 E Trace
  • 片段/活动生命周期和方向变化

    片段很有趣 但是 所以我想 一旦您了解了它们的怪癖 它们就是跨多个设备编写良好代码的宝贵工具 然而 在修复方向改变错误时 我遇到了困难 为了让我的片段工作 它需要访问属于它的包含活动的视图 这引导我进行愉快的追逐 试图找到活动和片段生命周期
  • Android APK 文件和 DEX 文件未创建,没有警告或错误

    我开发Android已经有一段时间了 使用WIN7 64位和Eclipse 由于我尝试安装新的 ADT 1 5 我遇到了一个非常奇怪的现象 我的构建未完成 并且未生成 APK 文件 也未生成 dex 文件 类文件已创建 但没有其他任何内容
  • C# 中的互相关代码 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 大家好 我
  • 如何通过将内存存储到磁盘并在以后恢复来“休眠”Linux 中的进程?

    Linux 中的进程可以 休眠 吗 就像笔记本电脑中的 休眠 一样 我会将进程使用的所有内存写入磁盘 释放 RAM 然后 我可以 恢复进程 即从内存中读取所有数据并将其放回 RAM 然后我可以继续我的进程 我曾经维护过CryoPID htt
  • file.lastModified() 函数没有给出更新的值

    file lastModified 没有更新 虽然我更改了文件内容 但我在 Windows 上工作 我使用java文件 可能是什么问题 我需要对代码进行某种刷新吗 Java 至少 1 8 似乎可以缓存文件属性 我创建了一个 C 应用程序 它
  • 为什么分配单个字节时地址不连续?

    我动态分配内存如下 char heap start1 char malloc 1 char heap start2 char malloc 1 当我如下执行 printf 时 令人惊讶的是地址不是连续的 printf p p n heap