参考和学习视频:
B站up主【拥有6块腹肌的程序猿的个人空间-哔哩哔哩】 https://b23.tv/rPiVDqX
视频地址:https://www.bilibili.com/video/BV1GH4y1o7C4?vd_source=f8a6ae1f67ceef69d4edbdd3820288ec
Linux系统程序内存地址分布图:

(图片来自:https://blog.csdn.net/mayue_web/article/details/128338850)
malloc是如何分配内存的
- 通过brk()系统调用,在堆区分配内存
- 通过mmap()系统调用在文件映射区域分配内存
- 总结:
申请小于128KB,则通过brk()申请内存;
申请大于等于128KB,通过mmap()申请内存; - 申请小于128KB:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { void *p = malloc(1024); printf("address is %p\n", p); while(1) { sleep(1); } return 0; }编译运行和查看:
- 申请大于128KB:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { void *p = malloc(1280 * 1024); printf("address is %p\n", p); while(1) { sleep(1); } return 0; }编译运行和查看:
- malloc申请1字节内存
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { void *p = malloc(1); printf("address is %p\n", p); while(1) { sleep(1); } return 0; }编译运行和查看:
堆区地址范围:556806371000-556806392000,转换为K为132K. - 当malloc申请内存小于128K时,free释放内存,不会将那块内存还给操作系统。但当申请内存大于等于128K时,free释放内存时会将当时分配的内存还给操作系统。当调用free()函数释放内存时,它会根据堆管理数据结构中记录的大小信息来确定要释放的空间大小。
- free释放内存
free(NULL); //不会崩溃 void *p = NULL; free(p); //不会崩溃 void *q = malloc(10); free(q); //正常释放 free(q); //double free,会崩溃。 q = NULL; free(q); //不会崩溃


