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