malloc没那么简单

news/2024/7/20 15:50:55 标签: malloc, 内存管理, glibc, api

malloc_0">malloc的用法

在函数的实现中,经常需要动态的申请内存,就需要调用malloc函数来申请。malloc函数的使用范围很广,在使用时一般只需要包含stdlib.h就可以直接使用,下面展示一个malloc的简单实例。
mem.c

#include <stdio.h>
#include <stdlib.h>

void main()
{
	unsigned int  *ptr = NULL;
	ptr = malloc(2000);
	*ptr = 0x12345678;
	printf("ptr:	%p ,*ptr:	%x\n",ptr,*ptr);
	free(ptr);
}

编译运行

 gcc mem.c -o mem
 ./mem

运行结果

在使用malloc时一定要配套使用free函数,否则可能导致程序异常。如果malloc的次数较少,可能不会引起程序崩溃;但如果malloc次数过多,会导致内存被申请耗尽,程序就会崩溃。

malloc_27">c库中malloc的实现

上面的例子程序就包含了一个头文件,就可以使用malloc和free函数。可以思考下,为何应用程序中可以直接调用malloc函数呢?既然malloc是个函数,必然有其函数实现的地方,那malloc是在哪个文件中实现的呢?
可以通过分析可执行文件的代码结果,获得答案。
在这里插入图片描述
从上述结果中可以知道,可执行文件会调用动态库libc.so.6。显然,libc.so.6动态库中必然会实现malloc和free函数。
在这里插入图片描述
libc-2.19.so是由glibc编译产生的,glibc是开源的,可以下载源码进行查看。
glibc源码中有个malloc.c文件,其中定义了malloc的实现。

strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
strong_alias (__libc_memalign, __memalign)
weak_alias (__libc_memalign, memalign)
strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
strong_alias (__libc_mallinfo, __mallinfo)
weak_alias (__libc_mallinfo, mallinfo)
strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)

可以分析下__libc_malloc函数是如何实现的。相应的free的实现是在__libc_free中实现的。


http://www.niftyadmin.cn/n/1491990.html

相关文章

nginx php-cgi,nginx 和 cgi, fcgi 以及php-cgi, php-fpm

在apache 称雄的时代&#xff0c;经常会看到cgi&#xff0c;但是随着nginx 的出现以及时代的进步&#xff0c; cgi 的程序越来越少了.最近有需求安装smokeping&#xff0c;因此cgi 又被拿了出来CGI是common gateway interface的缩写&#xff0c;大家都译作通用网关接口&#xf…

ATF史上最全分析--bl1阶段

一、bl1是什么&#xff1f; bootloader 1简称bl1&#xff0c;通常bl1就是存放在bootrom中的代码&#xff0c;CPU上电解复位后&#xff0c;会从0地址&#xff08;具体启动地址&#xff0c;要看每个cpu自己的特性&#xff0c;一般是从0地址启动&#xff09;取指令运行&#xff0c…

ATF史上最全分析--概貌

一. 什么是ATF&#xff1f; 二. ATF加载流程&#xff1f; 三

java test的用法,Java的testcase用法

简单来说&#xff0c;就是测试开发&#xff0c;部署以及代码结构如下图所示&#xff1a;Disk.javapackage com.test.vo;public interface Disk {public void read();public void write(String m);}UDisk.javapackage com.test.vo;public class UDisk implements Disk {Override…

java微信公众号图文消息编辑器,如何使用微信公众号自带的编辑器做出简洁舒适的图文排版...

所谓云想衣裳花想容&#xff0c;写文章也讲内容与形式&#xff0c;做微信公众号、新媒体、自媒体&#xff0c;光生产内容还不够&#xff0c;编辑排版也非常重要。一个简洁、美观、使读者看起来舒适的排版能更好地抓住读者的眼球&#xff0c;愉悦读者的眼睛&#xff0c;才能更好…

简述什么是操作系统

操作系统 用于管理和控制计算机硬件和软件的计算机程序&#xff0c;是直接运行在裸机上的最 基本的系统软件,其他软件必须要在操作系统上才能运行。 功能&#xff1a; 管理计算机的硬件&#xff0c;软件和数据资源&#xff0c;控制程序运行 例如&#xff1a;在pc端安装QQ就需…

Liunx的前世今生(什么是分时操作系统)

Unix的前身 1965 年左右由贝尔实验室加入了麻省理工学院以及通用电气合作的计划&#xff0c;该 计划要建立一套多使用者、多任务、多层次的 MULTICS 操作系统&#xff0c;想让大型主机 支持 300 台终端1969 年前后这个项目进度缓慢&#xff0c;资金短缺&#xff0c;贝尔实验室…

什么是Linux及其优点(什么是GNU 计划)

什么是Linux Linux 是由芬兰人李纳斯托瓦兹和众多爱好者共同开发出来一套免费使用和自由 传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX的多用户、多任务、支持多 线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 …