C语言中函数/过程的非局部变量是否存于堆与静态区?
C语言内存区域相关问题解答
函数/过程的非局部变量是否可存在于堆和静态区?
完全可以:
- 静态区:全局变量、用
static修饰的局部变量(作用域仅限定义它的函数,但存储在静态区,生命周期贯穿整个程序)都属于非局部存储的变量,它们的存储位置就在静态区。 - 堆:通过
malloc/calloc/realloc动态分配的内存块,不属于任何函数的栈帧,生命周期由程序员通过free控制——哪怕是在某个函数内分配的,只要没被释放,其他函数也能通过指针访问,这类内存属于堆上的非局部变量。
原表述的准确性判断
原表述存在部分不准确之处,修正说明如下:
- 堆的描述:基本正确,但要补充:动态分配的是内存块,而用来指向这块内存的指针变量本身可能在栈上(比如函数内定义的
int *p = malloc(4);,p在栈,它指向的4字节内存在堆);另外realloc也是常用的堆内存分配函数。 - 静态区的描述:不准确。静态区不仅包含全局可访问的全局变量,还包括用
static修饰的局部变量(这类变量仅在定义它的函数内可见,但存储在静态区),以及字符串常量(比如"hello"这类字面量)。 - 栈的描述:基本正确,但栈中除了局部变量,还会存放函数调用的返回地址、函数参数、寄存器上下文等数据;另外用
register修饰的局部变量可能会被放在CPU寄存器中而非栈上,这属于编译器的优化行为。
内容的提问来源于stack exchange,提问作者dok
相关产品推荐
相关产品推荐

