0
点赞
收藏
分享

微信扫一扫

动态内存开辟(malloc,calloc,realloc,free)

云岭逸人 2022-04-02 阅读 65
c语言

malloc:

在堆区开辟一段连续可用的空间,并返回指向这块空间的指针。

1.返回类型是void*,malloc并未规定开辟空间的具体类型,由使用者决定。

2.如果开辟成功,返回指向这个空间的指针。

3.如果开辟失败,返回空指针,所以在使用malloc时要对返回的指针进行判空操作。

4.当size_t=0,这是标准未定义的,具体由编译器决定。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int arr[10];//在栈区开辟40个字节
	int* p = NULL;
	p = (int*)malloc(10 * sizeof(int));//在堆区开辟40字节
}

calloc:

1.calloc的作用是开辟num个大小为size的空间,并初始化为0。  

 2.与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0

realloc:

memblock:要调整的内存的地址

size:重新调整的内存大小

返回的是这块内存的起始位置

reallc调整内存的两种方式:

1.如果原有空间后面有足够的空间,直接在后面追加空间。

2.如果原有空间后面没有足够的空间,重新在开辟一块空间。把原来空间的数据拷贝过来,并原来空间的地址置于NULL,返回一块新的地址。

int main()
{
 int *ptr = (int*)malloc(100);
 if(ptr != NULL)
 {
     //业务处理
 }
 else
 {
     exit(EXIT_FAILURE);    
 }
 //扩展容量
 //法1
 ptr = (int*)realloc(ptr, 1000);//error,如果申请失败,返回NULL,原来空间的起始地址会丢失
 
 //法2
 int*p = NULL;
 p = realloc(ptr, 1000);
 if(p != NULL)
 {
 ptr = p;
 }
 //业务处理
 free(ptr);
 return 0;
 }

 free:

释放动态开辟的空间,谁开辟谁释放。

1.如果memblock指向的是非动态开辟,这是标准未定义。

2.如果memblock指向NULL,则free函数没有任何操作。

举报

相关推荐

0 条评论