C语言 动态内存分配

目录

一、为什么使用动态内存分配?

二、malloc、free、memset

三、calloc

四、realloc

五、内存泄漏

六、alloca


一、为什么使用动态内存分配?

  对比数组来看,在声明数组时,必须用一个编译时常量指定数组的长度。但是,数组的长度常常在运行的时候才知道,这是因为它所需的内存空间取决于输入数据。

  例如,我们在计算学生的等级和平均分的程序中可能需要存储一个班级所有学生的数据。但不同班级学生的数量可能不同,通常情况下,我们通过声明一个内存更大的数组进行储存,它可以容纳可能出现的最多元素。

 这种方法的优点是简单,但是它依然有几个缺点:

1.这种声明在程序中引入了人为的限制,如果程序需要的元素超过了数组声明的长度,此时程序无法处理这种情况。要避免这种情况,通常的方法就是声明一个更大的数组,但这种做法也加剧了第2个问题。

2.如果程序实际所需的元素数量比较少时,巨型数组的绝大部分内存空间都被浪费了。

  为了避免这些问题,我们引入了动态内存分配。

二、malloc、free、memset

  首先,我们应该清楚的是,动态内存是在堆内存上面进行动态内存开辟的

  比如,我们现在要开辟n个数组单元格。在这里面,我们不能通过int arr[n]进行开辟。由此,我们引入malloc。

int *arr = (int*)malloc(n * sizeof(int));

 我们举一个例子:

double *p = (double*)malloc(80);

  我们开辟了80个字节的内存,以double类型进行解析,也就等价于double p[10]。

二者的区别在于

1.数组是局部变量,是在栈上面开辟的,而malloc申请出来的内存是在堆区存储的。

2.栈上面的内存由系统自动回收,而malloc自己申请完,不再使用的时候,得通过free(p)进行释放。

  上面所说的free(p)是指将p所指的内存释放掉,将内存归还给操作系统,经过释放之后,这块内存操作系统会分配给其他进程使用,p此时的形式就成为野指针或者悬挂指针。同时令p =NULL,为了防止多次释放出现指针崩溃的现象。

接下来,我们看看malloc的使用:

int main()
{ 
    int *p = (int*)malloc(sizeof(int)*10); //开辟10个int ->int p[10];
    assert(p != NULL);   //p == NULL 内存开辟失败
    for(int i = 0; i
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值