c-用引用澄清malloc()是否在每个系统上分配连续内存



在K&R书,第8章,解释了malloc((如何在空闲内存中创建一个块列表,每个块都指向下一个块(粗略地说(,不需要是连续的。另一方面,每个人都声称malloc((以连续的方式分配内存,我看到指针算法被大量使用,这个网站上也有类似的例子但是,始终没有任何官方来源

我阅读了C参考资料,没有发现任何关于邻接性的内容,我发现最好的是在Linux和Windows手册页上,他们在他们的系统上确保了这一属性。

因此:malloc((是否仅在规范的现代系统上提供连续内存(例如,使指针算术合法(,或者这是由>C89标准,我天真地忽略了它?请提供官方推荐信。非常感谢。

Ps:这不仅仅是一个理论问题。我正在为一个旧的DOS系统编写一些代码,我需要确定malloc的正确使用。

编辑:我现在明白我的错误了,谢谢。也就是说,我仍然找不到一个官方资源,其中明确指出单个malloc((调用返回连续内存(为什么这些信息不简单地包含在函数描述下面的标准库中…?(例如,这里没有跟踪(https://en.cppreference.com/w/c/memory/malloc)。

我想我可以引用与本书相关的段落:

malloc将从根据需要调整操作系统。由于程序中的其他活动也可能请求空间如果不调用这个分配器,malloc管理的空间可能不连续。因此空闲存储被保持为空闲块的列表。每个块都包含一个大小,一个指向下一个块的指针块和空间本身。块按存储地址增加的顺序保存最后一个块(最高地址(指向第一个。

您误解了它,它告诉每个malloc连续调用不一定都是连续分配的空间。这并不意味着一个分配的集团是不连续的。事实上,今天的操作系统和现代CPU在游戏中也有一个MMU,我建议你读一下。

引号表示,如果您将多次调用malloc,那么分配的块就没有必要是相邻的。

但在malloc的每次调用中,它都会分配一个相邻字节的内存区。如果不能做到这一点,它将返回一个空指针。

来自C标准(7.22.3内存管理功能(

1连续调用分配给aligned_alloc、calloc、malloc和realloc函数是未指明。如果分配成功,则返回的指针为适当对齐,以便可以将其分配给指向任何类型的指针具有基本对齐要求的对象,然后用于访问空间中的此类对象或此类对象的阵列已分配(直到明确释放空间为止(。。。

相关内容

  • 没有找到相关文章

最新更新