函数调用中的static关键字

SJP*_*PRO -1 c

关于以下代码:

#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

任何人都可以帮助我理解这两个问题吗?

Jim*_*ter 5

函数内部的静态定义就像在符号范围之外的函数之外的静态定义(在程序中可以引用它).它与堆栈帧无关... k不在堆栈中,它位于"静态"/global/.data内存中.

我知道这不像普通变量,因为第一个k ++返回1而不是0

不,它返回0,但k的值则为1.

在静态k上,k ++ //返回1,2,3

不,那不正确......它返回0,1,2 ......

并且它不像全局,因为我无法访问主要内部的k例如

这就是名称范围的工作原理; 它与k的存储方式无关.