C语言中堆内存管理
C语言中并没有管理堆内存的语句,而是由标准库提供一套函数来进行管理。
函数有四种分别为malloc、calloc、relloc、free。用到的头文件为 stdlib,h。
malloc函数的用法
void * malloc (size_t size);
功能:向系统申请一块堆内存。
size:内存块的字节数
返回值:成功返回内存首地址,失败返回NULL。
注意:使用malloc分配的堆内存空间是没有初始化的,要想初始化可使用以下函数。
1.函数的头文件为strings.h
void * bzero (void * s ,size_t n);
功能:把一块内存的所有字节赋值为0
s: 内存的首地址
n:内存块的字节数
如果不想赋值为0可以使用memset
void * memset(void s ,int c ,size_t n);
功能:把一块内存的所有字节赋值为c
s:内存的首地址
c:要赋值的数据,范围0-255
n:内存块的字节数
注意:当首次使用malloc向系统申请内存时,为了提升效率会一下子分配33页内存给malloc管理,之后再使用malloc时会直接从这33页内存中进行分配而不会再向系统去申请。
void * free(void * ptr);
功能:释放内存
1.可以释放空指针
2.不可以重复释放
3.只释放使用权,不会清理释放的内存
注意:系统对堆内存的管理决定了是否会产生段错误,malloc和free只是在管理用户的使用权限。
void * calloc(size_t nmemb , size_t size);
功能:向系统申请多块相同字节数的堆内存,并把每个字节数初始化0
nmemb:要申请的块数
size:每一块的字节数
所以calloc函数执行速度比calloc要慢,而且calloc函数底层调用了malloc函数,而且函数中两个参数互换不影响最后结果。
void * relloc(void * ptr ,size_t size);
功能:调整分配的堆内存的大小,可以调大也可以调小
ptr:申请到的内存块的首地址
size:最终内存块的字节数
返回值:调整后的内存块的首地址,如果在原来那块内存上无法实现,它会重新申请一块size大小的内存,并把原来的释放。