Bootstrap

【c语言】堆栈的区别,具体哪些函数或变量属于哪个区域

堆、栈

C语言中,内存分为堆和栈两个部分。堆和栈都是内存分配方式,但它们的管理方式和使用情景不同。
先说一个总结性的话,堆栈本质上就是内存,只不过对不同内存区域起了名字,方便进行管理。

堆是程序在运行期间分配的内存空间,在程序运行时,操作系统给每个进程分配一定的堆内存,程序可以在堆上申请自己所需的空间。堆内存空间独立于程序的执行和调用的环境,可以在程序的任意位置进行动态分配和释放。

堆内存的管理需要由程序员亲自处理,即手动申请与释放,一般使用 ​**malloc()**​ 或者 ​**calloc()**​ 系列函数来申请堆内存,并使用 ​**free()**​**​ 函数来释放堆内存。**堆内存是程序员可以控制的内存池,大小通常由可用内存决定(虚拟地址空间的大小)。因此动态内存管理比栈更灵活,但也更复杂。

使用堆内存时,需要花费时间去记得哪些内存被占用,哪些是完全闲置的。因此,应该优先使用栈内存,在确实需要动态内存分配时才考虑使用堆。

栈是一种具多级“后进先出”特征的数据结构,有固定的大小,并且具有他们自己的指针,栈的内存空间由程序自动分配,主要用于存储程序中的各种变量。

在C语言中,一个函数每次被调用时会为其分配一块栈区域,当函数执行完毕后,这个栈区域会自动释放。因此,栈的内存管理是由编译器自动处理的,申请和释放内存的速度非常快。

应该注意栈的大小是有限制的,在程序运行期间,操作系统为每个线程分配了固定的栈空间。如果栈满载,程序就会崩溃或产生其他错误。

**栈维护局部变量、返回值、参数和函数的调用等内容。由于栈的局部性质,存取数据速度通常比堆内存更快。**所以对于小型数据结构及基本类型,使用栈内存分配比较合适。

分配到栈(stack)的命令:

  • 函数调用:每当调用一个函数时,函数的参数和局部变量都会分配到栈上。当函数返回时,栈上的这些数据将自动被释放。
  • 局部变量声明:在函数内部声明的局部变量会分配到栈上。当变量超出其作用域时,栈上的内存将自动被释放。

全局变量和静态变量

全局变量和静态变量通常在程序的数据段中分配内存,而不是堆或栈中。这些变量在程序的整个生命周期内都存在,不会随着函数的调用和返回而分配和释放。

;