问几个关于 C 语言里 malloc 函数的问题

2017-02-07 11:48:41 +08:00
 Newyorkcity
#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()函数每次申请,之前已经申请到的内存空间应该不会消失吧?两次连续的申请之间,分配的新的内存空间是不连续的吗?
谢谢

1483 次点击
所在节点    问与答
4 条回复
ho121
2017-02-07 11:54:48 +08:00
implementation-dependent
extreme
2017-02-07 12:20:36 +08:00
p1-p0 不清楚,有可能是 link 的库从那个地方 malloc 过, free 后并不是立刻修改堆指针,而是记录被 free 后的地方的信息,下次 malloc ,如果这个位置合适的话重复使用。
超过某个大小, malloc 将通过匿名 nmap 实现,向上提升大小至单位页大小的倍数。
此外, malloc 修改堆指针的偏移量会比你实际申请的内存多一点,返回的指针是实际起始位置向后偏移一点点,也就是说,返回的地址前面记录了你 malloc 的内存的信息, free 的时候使用。
Newyorkcity
2017-02-07 16:44:17 +08:00
v 站帖子的上升机制是怎么样的。。
opsll
2017-02-07 19:13:40 +08:00
malloc 分配的内存不是连续的,返回的指针前面存在有一个数据结构来保存分配的内存信息,一般不同的 malloc 实现,这个数据结构的大小也可能不太一致。
p1-p0 可能表示这中间的内存已经被使用了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/338687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX