C语言 两种内存分配方式 malloc函数动态分配

C中开辟内存空间的两种方式

1、静态开辟内存
这种开辟内存空间的特点是所开辟的内存是在栈中开辟的固定大小的
例如:

int a;
int b[5];

a是4个字节,数组b是20字节

这种方式数组在申明时必须指定其长度,因为数组的内存是在编译时分配好的。
如果我们想在程序运行时才确定一个数组的大小,静态开辟内存空间的方法是不行的
例如:

int n;
scanf("%d",&n);
int a[n];

这样编写会在编译时出错

2、动态开辟内存
在C中动态开辟空间有三个函数:malloc(),calloc(),realloc(),这三个函数都是向堆中申请的内存空间。
在堆中申请的内存空间不会像在栈中存储的局部变量一样,函数调用完会自动释放内存,需要我们手动释放,就需要free()函数来完成。

这里只讲用malloc()函数实现动态分配和free()函数释放内存
(1)malloc()函数
①malloc()函数会向堆中申请一片连续的可用内存空间。
②若申请成功,返回指向这片内存空间的指针,若失败,则会返回NULL,所以我们在用malloc()函数开辟动态内存之后,一定要判断函数返回值是否为NULL。
③返回值的类型为void* 型,malloc()函数并不知道连续开辟的sizeof个字节是存储什么类型的数据,所以需要我们在malloc()前加强制转换,转换为我们所需的类型。如:(int*)malloc(sizeof(int)*n)

malloc()具体用法

int *p=NULL;
int n;
scanf("%d",&n);
p=(int*)malloc(sizeof(int)*n);
if(p!=NULL)
{
	//需要进行的操作 
}

这时就相当于创建了一个数组p[n],这个n的值并不需要像定义一个普通数组一样必须是常量,可以是用户输入

(2)free()函数
在堆中申请的内存空间不会像在栈中存储的局部变量一样,函数调用完会自动释放内存,如果我们不手动释放,直到程序运行结束才会释放,这样就可能会造成内存泄漏,即堆中这片内存中的数据已经不再使用,但它一直占着这片空间,所以当我们申请的动态内存不再使用时,一定要及时释放。

free()具体用法

int *p=NULL;
int n;
scanf("%d",&n);
p=(int*)malloc(sizeof(int)*n);
if(p!=NULL)
{
	//需要进行的操作 
}
// 操作完成,不再使用这片内存空间 
free(p);  
p=NULL;
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值