在说到static之前,需要先明确变量类型:
而在聊到变量类型之前我们可以将变量的两个属性好好学一学
变量的两个属性
作用域(scope):
从内存的角度来看,就是变量存放在栈(stack)中,还是 数据段中(Data Segment),那么stack和Data segment又有什么区别呢?
链接性(linkage)
分为外部链接性(external linkage)和内部链接性(internal linkage),从函数的角度来看,就是函数能访问到的变量范围。
存储区
栈(stack
存储临时数据,例如内部变量(局部变量)和返回地址;
在下述的四种变量类型中,有且只有内部变量是存储在栈中。
数据段(Data Segment
数据段是全局变量和静态变量存放的主要区域,还可能包括程序的只读数据(如字符串常量)。数据段是程序的只读部分,用于存储程序的全局变量和静态变量。
在程序的整个执行期间,数据段保持不变。
变量类型:
外部变量(External Variable):
也称为全局变量(Global Variable)。
它们在程序的整个运行期间都是可见的,并且可以在程序的任何部分被访问。
外部变量具有外部链接性,这意味着它们可以在多个编译单元(如多个源文件)中共享。
内部变量(Internal Variable):
又称局部变量,它们只在定义它们的块(例如函数或代码块)内部可见。
内部变量具有内部链接性,这意味着它们不能在定义它们的块之外访问。
静态外部变量(Static External Variable):
当你在函数或代码块之外声明一个变量,并使用static关键字时,它就变成了静态外部变量。
静态外部变量具有静态存储期,即它们在程序的整个生命周期内都存在,但它们只在定义它们的编译单元中可见。
即使具有外部链接性,使用static关键字也会限制其可见性到定义它们的文件内。
静态内部变量(Static Internal Variable):
这是在函数内部声明的静态变量。
与自动存储期的局部变量不同,静态内部变量在函数调用结束后不会消失,它们的值在下一次函数调用时仍然保持。
静态内部变量只在定义它们的函数内可见。
分析static
可以看到有了static这个关键字(key word),外部变量就会被限制链接性,内部变量就会更改它的作用域,从而扩大了它的生命周期(LifeTime),而且在一个文件编译(汇编)的时候,只会赋一次初值,这个待会会看到。
1.8示例
示例代码
#include <stdio.h>
int fun() {
static int a = 0;
return (++a);
}
int main(void) {
printf("a = %d\n", fun());
printf("a = %d\n", fun());
return 0;
}
问1:该示例代码输出是什么?
答1:
问2:如果fun()中的static int a = 0;去掉static,输出又是什么呢?
答2:
问3:为什么static修饰的变量在返回值时会出现不同的情况?
我们先来看一下他们的各自的汇编的不同之处吧:、
有static的示例
无static的示例