C语言动态内存分配

目录

前言

一、动态内存是什么

 二、使用步骤

1.malloc的使用

什么是野指针

野指针产生的原因

野指针的危害

规避野指针的方法

2.calloc的使用

calloc与malloc的区别

3.realloc的使用

总结


前言

在C语言中,我们通常使用数组来开辟空间,当使用数组的时候,我们在内存中开辟的大小已经固定了下来,不能在函数运行过程中动态的扩充和缩小,要怎样才能解决这个问题呢?那就引出了这个内容——动态内存


一、动态内存是什么

动态内存是相对于静态内存而言的。所谓动态内存和静态内存指的是内存的分配方式,动态内存是在堆上分配的内存,静态内存是在栈上分配的内存。栈上分配的内存是由系统管理进行分配释放的,堆上分配的内存是由程序员自己管理进行分配释放的。


 二、使用步骤

1.malloc的使用

#include<stdio.h>
#include<stdlib.h> //调用malloc函数的头文件

int main(){
    int* p = (int*)malloc(10*sizeof(int)); //开辟内存
    if(p == NULL)  return;
    //使用
    free(p); //释放内存
    p = NULL; //防止野指针
    return 0;
}

​

​

​

什么是野指针

指针指向了一块随机的空间,不受程序控制

野指针产生的原因

我们在使用malloc()开辟空间时,要检查返回值是否为空,若为空则开辟失败。如果不为空,则指针指向的是开辟的内存空间的首地址。开辟的空间用free()释放掉后,如果程序员没有对它进行赋空值或其他赋值操作,就会成为一个野指针

野指针的危害

会造成指针崩溃,不好查找错误原因

规避野指针的方法

释放指针后将其赋值为NULL

2.calloc的使用

malloc和calloc函数都是用来申请内存的

calloc的使用与malloc的使用基本一致

#include<stdio.h>
#include<stdlib.h> //调用malloc函数的头文件

int main(){
    int* p=(int*)calloc(10*sizeof(int));
    if(p == NULL)  return;
    //使用
    free(p); //释放内存
    p=NULL; //防止野指针
    return 0;
}

​

​

​

calloc与malloc的区别

malloc申请的内存,内存中存放的内容是随机的,不确定的, 而calloc函数申请的内存为默认值,一般为0

3.realloc的使用

realloc对动态内存进行扩容

#include<stdio.h>
#include<stdlib.h>
#include<cassert> //assert函数的头文件

int main(){
    int len = 10*sizeof(int);
    int* p = (int*)malloc(len);
    assert(p != NULL); //断言p不为空
    
    //若内存不足,需扩容
   
    int* q = (int*)realloc(p,2*len); //2倍扩容 20个int
    //q为新的内存起点 q指向原来p的地址
    //扩容成功后p=q
    p = q; 
    free(p); //释放内存
    p = NULL; //避免野指针
    return 0;   
}

​

​

总结

1.每次开辟的内存不用了一定要free掉,malloc和free要成对存在,有几个malloc就要有几个free,与此同时,每释放一个动态内存就要将它指向NULL

2.只有动态创建的内存才能用free把它释放掉,静态内存是不能用free释放的,静态内存只能由系统释放

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值