关于以下代码:
#include <stdio.h>
int lastval(void)
{
`static int k = 0;
return k++;
}
int main(void)
{
int i = 0;
printf("I previously said %d\n", lastval());
i++;
i++;
i++;
i++;
i++;
printf("I previously said %d\n", lastval());
i++;
i++;
i++;
printf("I previously said %d\n", lastval());
i++;
i++;
i++;
printf("I previously said %d", lastval());
i++;
i++;
i++;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释静态如何保持其价值?我虽然这是因为函数的堆栈框架在返回后没有被销毁,所以我编写了这个代码在gdb下运行它,然后我在每一行之后做回溯,只有main的堆栈框架显示出来(当我做的时候它甚至没有列出lastval坐在printf电话上的回溯,但无论如何).
它的k实际如何存储?我知道这不像普通变量,因为第一个k ++返回1而不是0,并且它不像全局,因为我无法访问main中的k,例如,那么......发生了什么?
`在本地k上,K ++ //总是返回0
`在全局k = 0,k ++ //返回0,1,2
`在静态k上,k ++ //返回1,2,3
任何人都可以帮助我理解这两个问题吗?
函数内部的静态定义就像在符号范围之外的函数之外的静态定义(在程序中可以引用它).它与堆栈帧无关... k不在堆栈中,它位于"静态"/global/.data内存中.
我知道这不像普通变量,因为第一个k ++返回1而不是0
不,它返回0,但k的值则为1.
在静态k上,k ++ //返回1,2,3
不,那不正确......它返回0,1,2 ......
并且它不像全局,因为我无法访问主要内部的k例如
这就是名称范围的工作原理; 它与k的存储方式无关.