本篇文章计划用最简单的方式向大家介绍C语言动态内存管理这一问题

如果各位看官姥爷们觉得有用的话,不妨动动你们手指,点赞、评论、收藏哦!

目录

1.为什么需要动态内存分配

2.动态内存的介绍

2.1malloc和free

2.2calloc

2.3realloc

3.常见的动态内存使用错误

3.1对空指针的解引用操作

3.2对动态空间进行越界访问

3.3 对非动态开辟空间使用free

3.4使用free释放动态内存的一部分

3.5对同一静态内存的多次释放

3.6忘记释放空间

4.经典笔试题练手

4.1练习一

4.2练习二

4.3练习三

4.4练习四

5.结语


1.为什么需要动态内存分配

我们常见的内存开辟方式有:

int a = 20;//在栈空间上开辟四个字节
char arr[10] = { 0 };//在栈空间上开辟10个字节的连续空间

上述内存开辟方式有两个特点

1. 空间开辟大小是固定的。2. 数组必须指定数组的长度,以获取所需内存。

但是我们对于空间的需求,不仅仅是上述的情况。有时候我们需要根据情况来决定开辟空间的大小
此时动态内存的作用就凸显出来了


2.动态内存的介绍

2.1malloc和free

void* malloc(size_t size);

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定
  • 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
void free(void* ptr);

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收 

话不多说,直接上代码

int main()
{int arr[40] = {0};int* prt = (int*)malloc(40);//申请空间//检查if (prt == NULL){perror("malloc");//检查错误的函数,要使用双引号,检查的是开辟空间的mallocreturn 1;}//初始化int i = 0;for (i = 0; i < 10; i++){*(prt + 1) = i;}//释放空间free(prt);//这里释放的是地址,因此不需要解引用prt = NULL;return 0;
}

2.2calloc

C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配,其具体使用我们结合下面一个函数来讲解

  • 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0
void* calloc(size_t num, size_t size);

2.3realloc

  • realloc函数的出现让动态内存管理更加灵活
  • 当我们发现过去申请的空间太小或太大,那为了合理的使用内存,我们可以使用realloc 函数实现对动态开辟内存大小的调整。
void* realloc(void* ptr, size_t size);

话不多说,让我们一起来看一下calloc和realloc代码的实现吧

int main()
{//申请空间//calloc需要两个参数(元素、每个元素类型的大小)//且在申请之初就会初始化空间为0int* ptr = (int*)calloc(10, sizeof(int));//ptr必须是指针//检查if (ptr == NULL){perror("calloc");//打印错误return 1;}//打印int i = 0;for (i = 0; i < 10; i++){printf("%d ", *(ptr + i));}//释放空间//free(calloc);//假设空间不够,需要扩容20个元素//原内存空间不够会重新寻找一块空间,将原有内存剪切到新的大空间上,并且把原空间释放int *p = (int*)realloc(ptr, 80);//20个整形需要80个字节if (*p != NULL)//防止内存不够,返回空指针{ptr = p;}//扩容成功free(ptr);ptr = NULL;return 0;
}

3.常见的动态内存使用错误

3.1对空指针的解引用操作

即没有判空,在malloc等函数申请空间是有可能会申请到空指针;

解决方法:判空

3.2对动态空间进行越界访问

解决方法:弄清楚动态内存的边界

 for (i = 0; i <= 10; i++)//原申请空间<10,超过10会出现越界访问{printf("%d ", *(ptr + i));}

3.3 对非动态开辟空间使用free

必须在动态开辟空间的起始位置进行释放,否则可能会造成内存泄露(只申请,不归还)

3.4使用free释放动态内存的一部分

3.5对同一静态内存的多次释放

3.6忘记释放空间


4.经典笔试题练手

4.1练习一

void GetMemory(char* p) //这里的指针p在函数结束之后就销毁了,没有将地址返回到Test函数中
{p = (char*)malloc(100);
}
void Test(void) {char* str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}

4.2练习二

char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();//虽然str获取到了字符串的地址,但是由于上函数的销毁,原空间也不存在了,无法在进行访问printf(str);
}

4.3练习三

void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test(void) {char* str = NULL;GetMemory(&str, 100);//如果不取地址将无妨修改strstrcpy(str, "hello");printf(str);//忘记释放空间//free(str);//str = NULL;
}

4.4练习四

void Test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);//str = NULL;//可以通过设置空指针避免此类问题if (str != NULL){strcpy(str, "world");//free已经将空间还给操作系统了,这里的修改是非法修改printf(str);}
}

5.结语

看到这里,相信老铁们对动态内存管理的知识已经有了基本的了解。

我是计算机海洋的新进船长Captain_ldx,如果我的文章能对您有帮助的话,麻烦各位观众姥爷们点赞、收藏、关注我吧!如果你对我的文章有任何问题或者意见,欢迎在评论区给我留言。后期更多知识点将持续更新......

(C语言)动态内存管理相关推荐

  1. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

  2. C语言动态内存管理和动态内存分配函数

    给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...

  3. C语言-动态内存管理(malloc()、calloc()、realloc()、free())

    C语言 动态内存分配 文章目录 C语言 动态内存分配 前言 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.初识malloc()和free() 2.malloc()和free()的简单使用 ...

  4. C语言动态内存管理和动态内存分配

    动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序.标准库提供以下四个函数用于动态内存管理: (1) malloc().calloc() 分配新的内存区域. ...

  5. C语言与JAVA内存管理_C语言动态内存管理和动态内存分配

    动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序.标准库提供以下四个函数用于动态内存管理: (1) malloc().calloc() 分配新的内存区域. ...

  6. 【C语言进阶】详解C语言动态内存管理

    前言: 今天这篇博客将为大家讲解如何通过开辟动态内存,从而写出更加优秀的的程序.同时今天的内容对于以后想要继续学习c++的同学来说也尤为重要.那就让我们进入正题吧. 一.动态内存概述: 什么是动态内存 ...

  7. C语言-动态内存管理

    C语言中,我们在使用数组的时候,经常有这样的一个问题:数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配.有的时候,我们开辟的空间太小,无法满足我们的需求,有时又太大,浪费空间比较严重. ...

  8. C++语言动态内存管理介绍和示例

    C++动态内存 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的. 但是可能存在程序的内存需求只能在运行时确定的情况.在这些情况下,程序需要动态分配内存,C ++语言将运算符n ...

  9. C语言动态内存相关函数

    C语言动态内存管理函数有4个,分别为malloc,realloc,calloc和free.malloc函数分配一块堆内存:calloc是malloc的变种,功能相同,有细小的差别:realloc修改原 ...

最新文章

  1. 最优的去重处理——HashSet去重
  2. vuex 源码分析_Vuex源码解析
  3. Fedora 19配置心得
  4. mybatis一对多关联查询_一对一,一对多,多对多查询及延迟加载(N+1问题)分析
  5. 爬取古剑奇谭三官网的图片
  6. 使用Hyper-V安装Ubuntu16.04 Server 网络配置
  7. CentOS 7——yum错误[Error: rpmdb open failed]解决方案
  8. Java中数组的定义,怎么发现那个方括号放在变量名前或者后都是正确的?
  9. JS之字符串截取方法substring
  10. 前端事件绑定知识点(面试常考)
  11. FileSplit cannot be cast Exception
  12. webm视频怎么转换成mp4?
  13. 常用第三方APP 的url scheme
  14. 设置名字的第一个字为默认头像
  15. win10电脑一开夜神模拟器就蓝屏解决方法,亲测多次好用!
  16. Auto.js加密解密|快照Snapshot解密|Dex转js|Auto.js庖丁下载|解除APP限制
  17. 跳跃游戏 (贪心/动态规划/dfs)
  18. cad中直径符号不显示_怎么在CAD、Word里敲出直径符号,你会吗?
  19. IOS--UIScrollView delegate 协议-
  20. 笔记本 ASUS A3E 改用Windows Server 2003 的几个问题

热门文章

  1. 【沃顿商学院学习笔记】公益创业——08定义绩效指标Defining Performance Criteria
  2. 小红书内容营销的必读推荐 小红书运营策划方案上海氖天
  3. error: ‘CV_RGB2GRAY’ was not declared in this scope | OpenCV 找不到 | 错误简记
  4. 基于javaweb的图书进销存管理系统(java+ssm+jsp+bootstrap+mysql)
  5. java 微博第三方登录_java第三方登录(微博,QQ)详细代码
  6. c语言课程设计微博管理系统,支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)...
  7. 什么是大端模式和小端模式
  8. 提交APP到三星应用市场一直提示不符合 Galaxy特色体验的类别条件
  9. 2018年06月16日广州珠海长隆海洋世界之旅
  10. 如何修改Openwrt 默认配置将AP改成AP+STA模式