函数内的局部static变量是存储在data segment还是stack中?
C语言函数内局部static变量的存储位置
问题说明
我们需要明确:函数内部定义的局部static变量,是存储在数据段(data segment)中还是栈(stack)中?以下面的C语言代码作为示例:
#include <stdio.h> void f (void) { static int count = 0; // static 变量 int i = 0; // 自动变量 printf("%d %d\n", i++, count++); } int main(void) { for (int ndx=0; ndx<10; ++ndx) f(); }
结论
上述代码中的count变量存储在*数据段(Data segment)*中。
存储规则对比
- 所有被
static修饰的变量(包括函数内部定义的局部static变量),默认都会存储在数据段中,生命周期和整个程序的运行周期一致,不会随着所属函数调用结束而被销毁,所以上述代码中count的值会随着10次f()调用从0逐步累加至9。 - 没有特殊修饰的普通局部变量(比如示例中的
i)属于自动变量,存储在栈上,所属函数每次调用时会重新创建、初始化,调用结束后就会被回收,因此每次调用f()打印的i值始终为0。
内容的提问来源于stack exchange,提问作者Kannan Hari
相关产品推荐
相关产品推荐

