为何两个C语言示例中static静态存储表现存在差异?
函数内static变量的声明与初始化逻辑解析
第一个示例报错原因
在main函数的同一个作用域内,你重复声明了同名的static int i,C语言禁止同一作用域内存在重复定义的同名变量,因此编译器抛出错误:error: redefinition of 'i'——这个规则对普通局部变量同样适用,和变量是否为static无关。
第二个示例的输出逻辑解答
你混淆了static变量的声明初始化和变量访问的区别:函数内部的static变量,其初始化语句只会在程序第一次执行到该代码位置时运行一次,后续调用函数时会直接跳过初始化步骤,复用之前已经分配好的变量值。
具体执行流程:
- 第一次调用
increment函数时,执行static unsigned int counter = 0;:为counter分配内存并初始化为0,接着执行counter++将其变为1,打印输出1。 - 后续每次调用
increment,程序会跳过初始化语句,直接读取内存中已存在的counter值,执行自增后打印,因此输出依次是2 3 4 5。
核心要点:
- static变量的生命周期覆盖整个程序运行阶段,不会像普通局部变量那样在函数调用结束后销毁。
- 函数内的static变量初始化仅执行一次,后续调用仅对已有变量进行操作。
内容的提问来源于stack exchange,提问作者Paper Plane
相关产品推荐
相关产品推荐

