#include<stdio.h>
#include<stdlib.h>
int main(){
void *p;
int count = 0;
while((p = malloc(1024)) && count <= 5){
printf("p_%d = %p\n",count,p);
count ++;
}
}
p_0 = 00000000000213C0
p_1 = 0000000000026CC0
p_2 = 00000000000270D0
p_3 = 00000000000274E0
p_4 = 00000000000278F0
p_5 = 0000000000027D00
p1 - p0 = 0x5900;
p2 - p1 = 0x410;
p3 - p2 = 0x410;
p4 - p3 = 0x410;
为什么第一个 p1 - p0 出现如此奇怪的数?
然而, 0x410 转换为十进制数是 1040 而不是 1024 ,为什么?
malloc()函数每次申请,之前已经申请到的内存空间应该不会消失吧?两次连续的申请之间,分配的新的内存空间是不连续的吗?
谢谢
1
ho121 2017-02-07 11:54:48 +08:00
implementation-dependent
|
2
extreme 2017-02-07 12:20:36 +08:00 1
p1-p0 不清楚,有可能是 link 的库从那个地方 malloc 过, free 后并不是立刻修改堆指针,而是记录被 free 后的地方的信息,下次 malloc ,如果这个位置合适的话重复使用。
超过某个大小, malloc 将通过匿名 nmap 实现,向上提升大小至单位页大小的倍数。 此外, malloc 修改堆指针的偏移量会比你实际申请的内存多一点,返回的指针是实际起始位置向后偏移一点点,也就是说,返回的地址前面记录了你 malloc 的内存的信息, free 的时候使用。 |
3
Newyorkcity OP v 站帖子的上升机制是怎么样的。。
|
4
opsll 2017-02-07 19:13:40 +08:00
malloc 分配的内存不是连续的,返回的指针前面存在有一个数据结构来保存分配的内存信息,一般不同的 malloc 实现,这个数据结构的大小也可能不太一致。
p1-p0 可能表示这中间的内存已经被使用了。 |