在这篇文章中,我们比较了C语言编程中动态内存分配和静态内存分配的区别。我们也涵盖了内存的基本知识和不同类型的内存分配。
目录。
- 静态和动态内存分配的比较
- 什么是内存?
- C语言程序如何使用内存?
- 静态内存分配
- 静态内存分配中面临的问题
- 用于动态内存分配的函数
静态和动态内存分配的比较
| 静态内存分配 | 动态内存分配 |
|---|---|
| 1.它是在程序执行前完成的 | 1.在程序执行过程中进行 |
| 2.使用_堆栈_来管理静态内存分配 | 2.使用_堆来_管理动态内存分配 |
| 3.变量被永久地分配 | 3.变量不被永久分配 |
| 4.没有内存的可重复使用性 | 4.有内存可重用性。 |
| 5.它的效率较低 | 5.它的效率更高 |
| 6.执行速度比 | |
| 动态内存分配 | |
| 快 | 6.执行速度比静态内存 |
| 分配 | |
| 慢 | |
| 7.从 | |
| 程序 | |
| 开始 | |
| 到结束 | |
| ,内存一直被分配 | |
| 。 | |
| 7.7.内存可以在 | |
| 程序 | |
| 中的任何时候被释放。 |
什么是内存?
内存是一个小单元的集合,称为 字节.它用于存储数据,如程序、图像、音频等。在C语言程序中管理内存是非常有趣的,因为它测试了程序员的智力,即使是在有限的内存中管理工作。
C语言程序如何使用内存?
对于一个C语言程序来说,内存被分为3个部分。
- **堆栈。**由函数创建的局部变量被存储在这里。
- **堆:**它是位于_堆栈_和_永久存储区_之间的内存空间_。_
- 永久存储区。程序指令以及全局变量和静态变量都存储在这里。
静态内存分配
在运行时分配的内存被称为_静态内存。_
分配的内存是_固定的_,在运行时不能增加或减少。
内存_的分配_和_删除_是由编译器自动完成的。
变量被永久地分配。
例子。
int main(){ int arr[5]={1,2,3,4,5}; }
静态内存分配中面临的问题
- 当实施静态内存分配或在编译时分配内存时,程序员必须在声明时固定其大小。因此,程序员不能在运行时增加或减少数组的大小。
- 如果用户在运行时存储在数组中的值小于指定的大小,那么就会造成内存的浪费。
- 如果用户在运行时存储在数组中的值超过了指定的大小,那么程序可能会崩溃或行为不正常。
动态内存分配
在运行时分配内存的过程被称为_动态内存分配_。
位于_堆栈_和_永久存储区_之间的内存空间_,_被称为_堆,_在程序执行过程中用于动态内存分配。
在这里,由于函数和块的局部变量的创建和死亡,程序执行时堆_的大小不断变化_。
一切都是在_运行时_或_执行时_完成的_。_
如果需要,内存大小可以被_重新定位_。
不存在_内存浪费的问题。_
用于动态内存分配的函数。
- **malloc。**分配一个内存块
malloc函数保留一个指定大小的内存块并返回一个void类型的指针**。**我们可以把它分配给任何类型的指针。
符号:
ptr=(cast-type *) malloc(byte-size);
例子:
x=(int *) malloc(100 *sizeof(int));这里,
保留了相当于 "100倍int大小 "字节的内存空间,分配的内存的第一个字节的地址被分配给int类型的指针x。
它也可以用来为复杂的数据类型分配空间,如_Structures。_
记住,malloc分配的是一个连续的字节块。如果堆中的空间不足以满足请求,分配就会失败。如果它失败了,就会返回一个NULL。
- **calloc:**分配多个内存块
它通常用于存储派生数据类型,如_数组_和_结构体。_它分配多个存储块,每个块的大小相同,然后将所有字节设置为零。
SYNTAX:
ptr=(cast-type *)calloc(n,elem-size);
它为n_个块_分配连续的空间,每个块的大小为elem_-size字节_。所有的字节都被初始化为零,并返回一个指向所分配区域的第一个字节的指针。如果没有足够的空间,将返回一个NULL指针。
- **free:**释放已使用的空间
由于已经使用的内存被我们的系统实际使用,作为一个程序员,我们有责任在程序结束时或不再需要时释放该内存块。当存储空间有限时,这一点非常重要。
在程序执行之间,很可能出现我们不需要分配的内存的情况。因此,我们可以使用free函数,释放/释放该内存块,以供将来使用。使用这一功能,可以使程序达到最佳状态。
SYNTAX
。
free (ptr);
这里,ptr是一个指向内存块的指针,它已经被malloc或calloc创建。
使用无效的指针可能导致系统崩溃。
要记住的要点:
- 被释放的不是指针,而是它所指向的东西。
- 要释放一个由calloc
分配的内存数组,我们只需要释放一次指针。试图单独释放元素是一个错误。
改变* 一个块的大小
我们很可能后来想改变先前分配的内存,因为它不够用。也有可能是已经分配的内存大小比需要的大得多,我们想减少它。为了这两个目的,我们可以使用函数realloc。例子
:
最初的分配是-
ptr=malloc(size)
,那么重新分配的空间可以通过-来完成
。 ptr=realloc(ptr, _newsize_);
通过OpenGenus的这篇文章,你一定对C语言中的动态与静态内存分配有了清晰的认识。