【C语言】静态内存开辟₀、动态内存开辟¹、栈、堆。

时间:2022-12-26 16:00:27


????静态内存开辟₀

再说动态内存开辟的时候,我们先来介绍下我们已经学会的开辟内存空间的方法吧。

char arr[10] = {0}; //在所处的栈上连续开辟10个字节的内存空间
int a = 1; //在栈上开辟4个字节空间

【C语言】静态内存开辟₀、动态内存开辟¹、栈、堆。

这些就是我们前面所学的知识点常用开辟内存空间的办法↓

  • 我们所开辟的内存空间大小是固定的。
  • 我们在申明数组的时候,必须要指定数组当中的长度,这样它所需要的内存空间才能被编译系统所知道。从而得到内存上的一个分配。 

但是这样就会导致一个问题,当我们有的时候需要的空间大小必须是要在程序运行之后才能够被知道,那用数组的编译时候开辟空间的方式就不能够被满足。 

【C语言】静态内存开辟₀、动态内存开辟¹、栈、堆。

这个就好比就是我想要在一个程序运行当中当中输入两百个同学的信息,此时我用数组分配了1000个同学的信息。此时我就会浪费很多的内存空间。当我想输入2000个同学信息的时候,此时数组分配的1000个同学信息存放不下去。 

那么这个时候我们就可以使用动态内存开辟就可以完美的解决这个问题了。


????动态内存开辟¹

什么是动态内存开辟?



【C语言】静态内存开辟₀、动态内存开辟¹、栈、堆。

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小

【C语言】静态内存开辟₀、动态内存开辟¹、栈、堆。

那么既然说到这个再来说说栈和堆的概念n:↓这样更加方便且容易理解。

????栈

在执行函数的时候,函数内部局部变量的存储单元都是可以在栈上进行创建的,函数执行结束的时候这些存储单元会被自动的进行释放。栈区主要存放运行函数所分配的局部变量,函数的参数,返回数据,返回地址等。

????堆

通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。

当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。

接下来介绍下动态内存开辟的函数的使用,知道如何用了,那么就相当于学会了这个动态内存开辟。