c语言中的动态内存

目录

一、什么是动态内存

二、动态内存分配函数  

1.malloc向堆区申请一块指定大小的内存空间

2.free

3.calloc分配并使用0初始化内存空间

4.realloc函数扩容

一、什么是动态内存

我们的程序对象存储的位置有静态内存和动态内存还有栈内存,静态内存里存储着局部static对象,类的static数据成员以及定义在任何类外的变量,栈内存里保存着定义在函数内的非static对象,分配在静态内存或栈内存中的对象有着严格的生存期,由编译器自动生成和销毁。但有时我们需要在程序运行时动态分配对象,这个时候就需要用到动态内存了,动态内存的生存期由程序来控制,也就是说,我们必须在使用完程序后释放这部分内存,否则就会造成内存泄漏。

二、动态内存分配函数  

c语言中动态内存管理的有四个函数:malloc,calloc,free,realloc。使用它们都需要引用<stdio.h>或<malloc.h>头文件。

1.malloc向堆区申请一块指定大小的内存空间

使用格式:void*malloc(size_t)size_t 要开辟的字节数 

例如:

int* p=malloc(40);

上诉代码指的是开辟一个40个字节的空间。

注意:如果我们开辟的空间太大,我们是开辟不出来的。因为在Windows系统中堆区的大小大概在1.5~1.9GB 。

2.free

由于堆区和栈区不同,在开辟一个空间后,如果使用过后不去把他释放掉,那它会一直存在那里,别人也无法使用。

当我们free掉内存空间后,p仍旧指向这片空间,要是我们不小心再次使用,就会发生非法访问,所以此时就要将指针变量指向NULL。

注意:以下三种情况使用free可能使函数崩掉

1.连续多次释放

int* p=malloc(100);
free(p);
free(p);

2.free(野指针); 

3.free栈上的空间

int a=0;
int* p=&a;
free(p);

3.calloc分配并使用0初始化内存空间

calloc函数和malloc函数作用差不多,但是参数不同

使用格式:void *calloc( num, size_t  );

num 表示要开辟的个数

size_t表示开辟一个占据的字节数

例如:

int* p = (int*)calloc(10,4)

表示开辟10个,每个占据4个字节。

同时作用有些差异

malloc开辟的空间里面是随机值

calloc开辟的空间并且初始化了,初始化为0

4.realloc函数扩容

使用格式:void *realloc( void *memblock, size_t);

void *memblock 第一次开辟空间的地址,要是没有第一次开辟,可以写成NULL 相当于第一次开辟了

size_t开辟空间的总大小 == 第一次的 + 追加的

三种内存的扩容方式:

1.后面的区域比较充裕,直接在原内存后面续上

2.前面有空余:将内存中的内容赋值到前面,后面空闲出来的内存相当于对其扩充内存

3.堆内存不足,扩展空间失败,realloc函数返回NULL。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘不要秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值