C语言中的动态与静态内存分配

264 阅读5分钟

在这篇文章中,我们比较了C语言编程中动态内存分配和静态内存分配的区别。我们也涵盖了内存的基本知识和不同类型的内存分配。

目录

  1. 静态和动态内存分配的比较
  2. 什么是内存?
  3. C语言程序如何使用内存?
  4. 静态内存分配
  5. 静态内存分配中面临的问题
  6. 用于动态内存分配的函数

静态和动态内存分配的比较

静态内存分配动态内存分配
1.它是在程序执行前完成的1.在程序执行过程中进行
2.使用_堆栈_来管理静态内存分配2.使用_堆来_管理动态内存分配
3.变量被永久地分配3.变量不被永久分配
4.没有内存的可重复使用性4.有内存可重用性。
5.它的效率较低5.它的效率更高
6.执行速度比
动态内存分配
6.执行速度比静态内存
分配
7.从
程序
开始
到结束
,内存一直被分配
7.7.内存可以在
程序
中的任何时候被释放。

什么是内存?
内存是一个小单元的集合,称为 字节.它用于存储数据,如程序、图像、音频等。在C语言程序中管理内存是非常有趣的,因为它测试了程序员的智力,即使是在有限的内存中管理工作。

C语言程序如何使用内存?
对于一个C语言程序来说,内存被分为3个部分。

  • **堆栈。**由函数创建的局部变量被存储在这里。
  • **堆:**它是位于_堆栈_和_永久存储区_之间的内存空间_。_
  • 永久存储区。程序指令以及全局变量和静态变量都存储在这里。

storage of a c program

静态内存分配

在运行时分配的内存被称为_静态内存。_

分配的内存是_固定的_,在运行时不能增加或减少。

内存_的分配_和_删除_是由编译器自动完成的。

变量被永久地分配。

例子。
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是一个指向内存块的指针,它已经被malloccalloc创建。

使用无效的指针可能导致系统崩溃。
要记住的要点:

  1. 被释放的不是指针,而是它所指向的东西。
  2. 要释放一个由calloc

分配的内存数组,我们只需要释放一次指针。试图单独释放元素是一个错误。
改变* 一个块的大小

我们很可能后来想改变先前分配的内存,因为它不够用。也有可能是已经分配的内存大小比需要的大得多,我们想减少它。为了这两个目的,我们可以使用函数realloc。例子

最初的分配是-
ptr=malloc(size)
,那么重新分配的空间可以通过-来完成

ptr=realloc(ptr, _newsize_);

通过OpenGenus的这篇文章,你一定对C语言中的动态与静态内存分配有了清晰的认识。