既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
这样就可以保证你的超市不会因为堆积太多商品而显得拥挤,如果有人要买这些商品,你可以把仓库地址告诉他,他就会直接去你仓库拿货。
听过这个故事你可能更迷糊了,我下面给你梳理一下,相信你会豁然开朗!
动态申请空间,能动态确定对象所需要的内存。
我需要多大的空间,就用多大的仓库存放该商品。
对于大型对象的存储,栈区容不下。
我有大量的商品,都放超市太占地方。可以放仓库中,记住仓库地址就行。
传递指针比传递整个对象更高效。
别人要买该商品,告诉别人我仓库地址,不用把整个仓库搬过去。
(感觉这个故事我还是没有讲好,表达能力欠佳)
知道了动态分配内存的好处后我们就可以更好的理解我们为什么要使用动态分配内存以及何时应该使用动态分配了,所以如果你进了几包方便面(建了个很小的对象)那你就没必要把方便面放到仓库了,直接放到超市货架上就可以了。
如果你超市比较小(代码量比较小)那你也没必要把东西放到仓库了,直接放到柜台上就可以了。所以很多问出为什么要使用动态分配内存的主要原因是因为他现在还没接触过大型项目,或者特别大的对象,如果你做过底层驱动开发或者上位机开发的话相信你对于动态申请内存并不会陌生的。
通过上面的故事我们大概也已经知道什么时候我们需要使用动态分配内存了,这里再简单的给大家做一个总结。
1、当你的代码量很大,需要用到很大的数据块来存储对象时。2、当你的程序中用到大数组时,你就需要用动态分配内存。3、需要数组长度根据程序进行变化。4、想让一个变量储存的内容不会因为函数的结束而被收回(有点像全局变量)
这里就不得不来讨论一下“传统数组”的缺点了,传统数组”就是前面所使用的数组,与动态内存分配相比,传统数组主要有以下几个缺点:
- 数组的长度必须事先指定,而且只能是常量,不能是变量。比如像下面这么写就是对的:
int a[5];
而像下面这么写就是错的:
int length = 5;
int a[length]; //错误
- 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小。
- 对于数组所占内存空间程序员无法手动编程释放,只能在函数运行结束后由系统自动释放,所以在一个函数中定义的数组只能在该函数运行期间被其他函数使用。
而动态内存就不存在这个问题,因为动态内存是由程序员手动编程释的,所以想什么时候释放就什么时候释放。只要程序员不手动编程释放,就算函数运行结束,动态分配的内存空间也不会被释放,其他函数仍可继续使用它。除非是整个程序运行结束,这时系统为该程序分配的所有内存空间都会被释放。
所谓“传统数组”的问题,实际上就是静态内存的问题。我们讲传统数组的缺陷实际上就是以传统数组为例讲静态内存的缺陷。本质上讲的是以前所有的内存分配的缺陷。正因为它有这么多缺陷,所以动态内存就变得很重要。动态数组能很好地解决传统数组的这几个缺陷。
知道了我们为什么要动态分配内存之后我们一起来学习以下C语言中如何进行动态分配内存。在C语言中动态分配内存使用的是函数malloc
进行分配的。
malloc
是一个系统函数,它是 memory allocate
的缩写。其中memory
是内存
的意思,allocate
是分配
的意思。顾名思义 malloc
函数的功能就是分配内存
。要调用它必须要包含头文件 <stdlib.h>
,它的原型为:
# include <stdlib.h>
void *malloc(unsigned long size);
由上面的函数原型我们可以看出malloc
函数只需要一个形参,并且该形参是整形的。函数返回值为一个指向所分配的连续空间的首地址的指针。当函数未能成功分配存储空间时(如内存不足)则返回一个NULL
指针。所以malloc
函数的返回值为一个指针。
由于堆区内存也是有限的,不能无限制地分配下去,所以秉持着尽量节省资源,我们应该在分配的内存区域不用时,及时释放它,以便其他的变量或程序使用。
释放malloc
函数分配内存的函数是free
函数,free
函数和malloc
总是成对出现的。free
函数的原型如下所示:
# include <stdlib.h>
void free(void *p);
由上面的函数原型可以看出free
函数需要一个形参,且形参的类型是一个指针。free
函数无返回值,它的功能是释放指针变量 p
所指向的内存单元。此时 p 所指向的那块内存单元将会被释放并还给操作系统,不再归它使用。操作系统可以重新将它分配给其他变量使用。
知道了申请和释放要用到哪些函数后我们来一起看一下我们该如何使用这些函数来申请和释放内存。
我们这里直接贴出malloc
函数动态分配内存的使用语句:
int *p = (int *)malloc(4);
它的意思是:请求系统分配 4 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 p
。当用 malloc
分配动态内存之后,上面这个指针变量 p
就被初始化了。
需要注意的是,函数 malloc
的返回值类型为 void*
型,而指针变量 p
的类型是 int*
型,即两个类型不一样,那么可以相互赋值吗?
答案是可以的,原因如下:上面语句是将 void*
型被强制类型转换 成 int*
型,但事实上可以不用转换。C 语言中,void*
型可以不经转换(系统自动转换)地直接赋给任何类型的指针变量(函数指针变量除外)。
所以int*p = (int*)malloc(4);
就可以写成 int*p=malloc(4);
。此句执行完之后指针变量 p 就指向动态分配内存的首地址了。
我们知道如何申请一块内存了,也知道何时需要申请内存了,下面我们就来学习一下free
函数的使用。
五、如何将动态分配内存free掉
在讲解之前有一点需要提醒一下大家,free
函数只能释放堆区的空间,其他区域的空间无法使用free
函数的。
下面给大家贴出一段动态申请内存的程序,来给大家讲解一下free
的使用。
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int *p = malloc(sizeof*p);
*p = 10;
printf("p = %p\n", p);
free(p);
printf("p = %p\n", p);
return 0;
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!