你好, 欢迎回来｡ 在这节课中, 我想谈谈动态内存分配｡
这与指针直接相关, 您只能在指针上使用它｡
那么我们开始吧｡
因此, 每当你在c语言中定义一个变量时, 编译器会根据数据类型自动为你分配正确的存储空间｡
我们在整个过程中都看到了这一点｡ 当我们创建整数､ 浮点数､ 双精度数时, 我们不需要分配任何内存｡
编译器会为您执行此操作｡ 它实际上分配了一些内存｡
顺便说一句, 指针也是如此｡ 当你创建一个指针时,
内存会被分配给你, 这样它就可以存储一个指针类型, 一个地址｡
现在, 这并不意味着内存已分配给该地址｡
到目前为止, 每当我们给指针赋值时,
我们总是给一个已有的变量赋值.
所以如果我们想给指针赋值, 我们在一个变量上使用了&运算符地址,
这个变量已经分配了内存.
但是如果你想创建一个指针, 你不想给它赋值运算符的地址,
你想动态分配内存. 这就是整堂课的主旨｡
因此, 经常希望能够在程序运行时动态分配存储｡
根据需要分配内存｡
如果你有一个程序, 它被设计为从一个文件中读取一组数据到内存中的一个数组,
你有三个选择｡
你可以定义数组来包含编译时可能的元素的最大数目, 它是一个固定的大小｡
如果你定义了一个有50个元素的数组, 它只会包含50个元素.
编译器确定它是50, 它将在运行时分配这么多的内存｡
您可以使用可变长度数组来确定数组运行时的大小｡
我们讨论了一下这些可变长度数组, 直到C11才支持它们｡
他们实际上去掉了C11, 加入了C99｡
这是你可以放入变量的地方｡
但这些仍然是固定大小的,
因为这意味着变量链接数组, 这意味着你可以传入变量来表示大小｡
但它们还是静止的｡
或者, 最好的选择是您可以根据需要动态分配阵列｡
你可以调用不同的c函数来完成这个任务｡
因此, 能够动态分配内存将非常有用｡
第一种方法, 我们一直在用, 不管是数组还是数据类型,
它都是固定大小的.
您必须定义数组, 使其包含最大数量的元素,
这些元素将直接进入数组｡
所以你可以这样做, int dataArray [1000]｡
这意味着数据文件不能包含超过一千个元素｡
如果是这样, 你的程序就会崩溃｡
所以你只能希望你阅读到的文件没有太多的数据｡
您的程序将无法处理大量文件或大型文件｡
如果您确实想处理大文件, 则必须返回并使数组更大｡
你必须改变它的大小, 但是你必须重新编译它, 这是编译时间｡
无论您选择什么值,
将来都有可能再次遇到相同的问题, 因为它是一个固定的大小｡
这个大小是在编译代码时确定的,
它不会在运行程序时进行调整｡
它不会动态变化｡
使用动态内存分配函数, 您可以根据需要获得存储空间｡
此方法使您能够在程序执行时分配内存｡
想想这样做的好处吧｡
首先,
你不会创建大量你可能不会使用的内存, 你只会创建你需要的内存｡
如果你确实需要更多, 你可以分配更多｡
您不必返回并重新编译和更改大小｡
因此, 动态内存分配是可行的方法｡
它依赖于指针的概念, 并且它提供了在代码中使用指针的强烈动机｡
我们讨论了指针的优点,
你们可能会想, 好吧, 它们是一个很酷的概念, 但是为什么我们需要使用它们,
这是一个重要的原因, 这样你就可以动态地分配内存｡
再一次, 这是什么—-C语言是一种高效的语言, 不使用大量的内存｡
所以c语言运行在嵌入式系统上,
真实的编程, 这是原因之一, 因为你可以根据需要限制内存的使用量｡
因此, 动态内存分配允许在程序执行时动态分配用于存储数据的内存｡
动态分配内存只有在您有可用的指针时才是可能的｡
因为你有一个地址,
你可以改变指针指向的位置, 你可以重新调整内存｡
大多数生产程序将使用动态内存分配｡
如果你用c写代码, 你会用到这个｡
即使您是初学者, 也要使用动态内存分配｡
大多数有用的程序都将采用这个概念｡
通过动态分配数据,
您可以在运行时创建指针, 这些指针的大小刚好足以容纳任务所需的数据量, 因此不会浪费内存｡
至关重要｡
我们还必须讨论堆和堆栈｡
有两种方法可以在程序中存储内存,
两种不同的数据结构, 可以在堆栈上存储数据, 也可以在堆上存储数据｡
动态内存分配保留堆上的所有内容｡
我们不打算详细讨论它们是如何组织起来的, 但从本质上讲｡
当您在堆上存储数据时, 它允许进行更多的更改｡
你可以任意改变数据对象的大小,
当你在堆中分配内存时, 它会停留更长的时间, 它会停留在整个程序中｡
当你使用堆栈时, 它的限制更大｡
堆栈用于从函数参数到局部变量的所有内容｡
所有的东西都存放在那里｡
这就是我们讨论调用堆栈的原因｡
它研究方法和功能｡
我偶尔会使用方法, 但方法实际上是一个面向对象的术语, 所以函数｡
与函数相关的所有内容都在堆栈上创建｡
所以这意味着当你执行一个函数时, 它会被放到堆栈上.
局部变量被放到堆栈上｡
当您退出该函数时, 所有内容都将被删除｡
因此, 位于堆栈上的内存不会停留很长时间｡
这就是动态分配内存时内存在堆中的原因之一, 因为您可以控制何时使用内存,
何时不使用内存, 您可以分配内存, 也可以删除内存.
堆栈上的东西, 你无法控制｡
它会自动删除, 自动分配｡
所以局部变量, 函数内部的变量, 比如main,
这些都是在堆栈上创建的, 等等.
堆上的内存是不同的, 它是由你, 程序员控制的｡
当你在堆上分配内存时, 你要跟踪你的内存, 当你已经分配了不再需要的内存时,
那么你必须删除这些内存｡
当你不再使用空间时, 你必须释放它｡
这一点很重要, 因为内存是一种非常稀缺的资源｡
今天我们有很多内存, 你可以运行一台计算机, 12千兆, 16千兆,
不管是什么｡
但是对于在设备上运行的嵌入式程序,
您不一定有那么多内存｡ 因此,
您需要控制内存的使用量, 并在使用完内存后释放内存, 以便其他应用程序使用｡
同样, 在低级嵌入式系统中更重要｡
但这是许多语言所没有的自由｡
这种由程序员控制你的管理器内存的能力, 可以使程序效率高得多,
速度快得多｡
所以在下一节课中, 我们会讨论你如何做到这一点,
你可以调用什么函数｡ 显然, 有不同的函数,
你可以调用分配内存到自由内存了｡ -谢谢—谢谢