malloc没那么简单

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次数过多,会导致内存被申请耗尽,程序就会崩溃。

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中实现的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值