一般来说,当我使用malloc()
时,在哪个设备/表中保存了void* malloc (size_t size)
块页脚和标题?
修改
我有gcc (GCC) 4.8.1
编译器。
答案 0 :(得分:2)
在典型的实现中,没有“设备”或“表格”。页眉和页脚(如果有的话)是正在分配的块的组成部分。物理分配的块大于页眉和页脚大小所请求的块。所以,你实际分配的是
<header><user memory><footer>
malloc
返回的指针指向<user memory>
区域的开头。
我听说过将malloc
“家庭信息存储在其他地方的实施方式”,但在现实生活中没有看到它们。
答案 1 :(得分:1)
dlmalloc是许多较新的malloc库的基础。这是有据可查的。大多数C程序员都可以轻松阅读,不像一些宏观的,更现代,更高效,更便携的代码。它在用户空间开始之前使用内存进行内务管理。
通常链接不应该是一个好的答案,但这是代码的链接 - http://g.oswego.edu/pub/misc/malloc-2.6.6.c
答案 2 :(得分:0)
可以调整许多变量以使malloc()的行为适应应用程序的预期要求和约束。应在第一次调用malloc()之前对这些可调参数进行任何更改。请注意,某些库函数也可能使用动态内存(特别是来自:标准IO工具的那些),因此请确保在启动顺序中尽早完成更改。
变量__malloc_heap_start和__malloc_heap_end可用于将malloc()函数限制为某个内存区域。这些变量被静态初始化为分别指向__heap_start和__heap_end,其中__heap_start由链接器填充指向,__ heap_end设置为0,这使得malloc()假定堆位于堆栈之下。
如果要将堆移动到外部RAM,则必须相应地调整__malloc_heap_end。这可以在运行时完成,也可以直接写入此变量,也可以在链接时自动完成,方法是调整符号__heap_end的值。
以下示例显示了一个链接器命令以及外部RAM中堆到位0x1100的位置。堆将扩展到地址0xffff。
avr-gcc ... -Wl, - section-start,.data = 0x801100, - defsym = __ heap_end = 0x80ffff ...