V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2017-02-07 11:48:41 +08:00 · 1585 次点击
    这是一个创建于 2840 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #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()函数每次申请,之前已经申请到的内存空间应该不会消失吧?两次连续的申请之间,分配的新的内存空间是不连续的吗?
    谢谢

    4 条回复    2017-02-07 19:13:40 +08:00
    ho121
        1
    ho121  
       2017-02-07 11:54:48 +08:00
    implementation-dependent
    extreme
        2
    extreme  
       2017-02-07 12:20:36 +08:00   ❤️ 1
    p1-p0 不清楚,有可能是 link 的库从那个地方 malloc 过, free 后并不是立刻修改堆指针,而是记录被 free 后的地方的信息,下次 malloc ,如果这个位置合适的话重复使用。
    超过某个大小, malloc 将通过匿名 nmap 实现,向上提升大小至单位页大小的倍数。
    此外, malloc 修改堆指针的偏移量会比你实际申请的内存多一点,返回的指针是实际起始位置向后偏移一点点,也就是说,返回的地址前面记录了你 malloc 的内存的信息, free 的时候使用。
    Newyorkcity
        3
    Newyorkcity  
    OP
       2017-02-07 16:44:17 +08:00
    v 站帖子的上升机制是怎么样的。。
    opsll
        4
    opsll  
       2017-02-07 19:13:40 +08:00
    malloc 分配的内存不是连续的,返回的指针前面存在有一个数据结构来保存分配的内存信息,一般不同的 malloc 实现,这个数据结构的大小也可能不太一致。
    p1-p0 可能表示这中间的内存已经被使用了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2565 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:44 · PVG 12:44 · LAX 20:44 · JFK 23:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.