概念:
- malloc:用于申请一块指定大小的连续的内存区域,注意是在堆上开辟空间,如果开辟成功,返回该内存空间的首地址,如果开辟失败,返回空。
- calloc:和malloc用法很像,都是为了在堆上开辟内存空间,不同的是,calloc函数会将开辟的内存空间初始化为0,而malloc开辟的空间内部大部分都是随机数值,不具备初始化的功能
- realloc:用来调整已开辟内存空间的大小,调整时可扩大可缩小,扩大空间时,保留原有数据;缩小控件时,丢弃缩小那部分的数据,所以做缩小调整时要谨慎处理
用法:
三个函数引用的头文件都是< stdlib.h>
malloc:
- 函数原型: void* malloc(size_t size);
使用方法,举例:int p = (int)malloc(10*sizeof(int));//动态开辟10个整形数据单元
1.调用malloc函数时,需要定义一个指针变量用来接收返回值,若内存开辟成功,返回该内存的首地址,如果开辟失败,则返回空。所以在调用完malloc函数时,通常需要判断下指针变量是否为空。
2.原则上开辟后的空间地址返回类型为void*,但实际使用时我们常常会进行强转,使用会更加灵活
3.不仅能开辟常用类型,也能开辟诸如结构体之类的组合类型,如:
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));注意事项(敲重点!!!):在使用完开辟的内存空间后,一定要记得用free()函数释放该空间,而且释放完空间后要将指向该空间的指针置空,不然会出现野指针的问题。所以最好将free()函数封装一下,在调用完free后就将指针置空。
动态开辟的内存空间也是连续的,所以要防止越界访问
int* p = (int*)malloc(10*sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
//使用.......
free(p);
p=NULL;
calloc:
- 函数原型:void* calloc(size_t n,size_t size);
n : 成员数量
size:每个成员的长度,以字节为单位
意思就是在内存中开辟n个size大小的连续的空间 - 使用方法:和malloc使用方法如出一辙,注意事项也一样,这里不做过多强调
int *p = (int*)calloc(10,10*sizeof(int));//意思是开辟了10个40个字节大小的连续空间
free(p);
p==NULL;
realloc:
- 函数原型: void* realloc(void* mem_address,unsigned int newsize);
mem_address: 要改变的内存空间的首地址,也是是指向该空间的首地址的指针
newsize:新的内存空间的大小 - 使用方法:将需要改变大小的内存空间的指针传进去,然后定义新空间的大小。大体使用方法和malloc,realloc一样,不过有额外需要注意的地方
realloc在调整内存空间时存在两种情况:
1:原有空间之后有足够的大的空间
2:原有空间之后没有足够大的空间
- 注意事项:
1 .realloc也可以像malloc一样开辟新的空间,需要将mem_address传空值进去。空间开辟成功,返回新空间的地址,开辟失败,则返回NULL,说明剩余内存空间不够,原有的内存空间不变,所以在用指针接收realloc返回值时,最好使用新的指针,原有指针不要变动。
2.如果将新空间的大小设置为0,则释放原有空间,并返回NULL
3.如果新开辟的空间是上述第二种情况,则原有空间会被系统自动释放,无须担心