【发布时间】:2013-01-14 23:39:07
【问题描述】:
我动态分配内存如下:
char* heap_start1 = (char*) malloc(1);
char* heap_start2 = (char*) malloc(1);
当我按如下方式执行 printf 时,地址不是连续的。
printf("%p, %p \n",heap_start1,heap_start2);
结果:
0x8246008, 0x8246018
如您所见,有 15 字节的额外内存需要进行碎片整理。这绝对不是因为单词对齐。这种奇特的对齐方式背后有什么想法吗?
提前致谢!
如果这很重要,我在 linux 中使用 gcc。
【问题讨论】:
-
另外:Malloc 需要一些空间来自己记账。这通常是“N 字节”(对于一些小的 N)在返回的指针之前。
-
规范要求
malloc()返回一个指针,该指针适合任何具有基本对齐要求的对象对齐。这几乎肯定大于 1。 -
另一个注意事项 - 您不需要在 C 程序中强制转换
malloc()的返回值。 -
“令人惊讶的是地址不是连续的”——相反,如果它们是连续的,那将是非常令人惊讶的。 “这绝对不是因为单词对齐” - 取决于您所说的“单词”是什么意思。请阅读 malloc 文档。