c语言堆操作相关malloc,calloc,realloc,memset, free

memset

memset(void p, int c, int n) 初始化申请空间 ,将p指向的 n字节大小的空间,全部以字节为单位初始化成c, 例如:

char *p = (char *)malloc(sizeof(char) * 100);

memset(&p, 0, sizeof(char) * 100) //给*p指定的前100字节大小的内存空间设置为(只支持0, -1,以字节为单位赋初始值)

malloc

void * malloc(int n) 传入申请空间大小,单位字节,并返回该控件的内存地址

申请一块内存空间,并未初始化,一般会与memset(void *p, int c, int n)结合初始化内存空间

现在系统抹去内存区域只是把标记除去,并不会吧内存地址清楚为0,因此必须使用memset来初始化申请空间,否则申请的空间是内存中的默认非空白空间,可能会乱码或者与想象值不同

注意: malloc函数分配的空间也是未初始化的。

calloc

calloc()函数是malloc的简单包装。它的主要优点是把动态分配的内存清零。

void *calloc(int n, int size)

该函数与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。

注意:relloc函数分配的空间也是已初始化的。

realloc

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,其函数声明如下:

void * realloc(void * p, int n);

其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针 p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。

注意:relloc函数分配的空间也是未初始化的, 根据新指定大小与原来对比,来进行重分配,小于地址不变,大于则复制并重新分配,释放之空间。

free

void free(void * p); 释放p申请的空间,并设置为null

你可能感兴趣的:(c语言堆操作相关malloc,calloc,realloc,memset, free)