C语言中static对于变量的作用
程序员文章站
2022-03-23 19:45:10
一、static修饰全局变量:
当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段...
一、static修饰全局变量:
当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。根据这个原理,我们可以在多个文件中定义相同名字的全局变量而不影响,可以重名。
#include "file1.h" static char* hello = "hello csdn!"; void printstr() { printf("%s\n", hello); } //输出hello csdn
#include "file1.h" int main() { printstr(); printf("%s\n", hello); return 0; } //报错hello未定义
在文件file1中定义的静态全局变量,在file2文件中调用会报错
file2.c:5: 错误:‘hello’ 未声明 (在此函数内第一次使用) file2.c:5: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其所在的函数内只报告一次。)
二、static修饰局部变量:
? static局部变量中文名叫静态局部变量。
?????????? 1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在。
???????????2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
?????????? 3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
#include "file1.h" void printstr() { int normal_val = 0; static int static_val = 0; printf("normal_val = %d\n",normal_val); printf("static_val = %d\n",static_val") normal_val++; static_val++; }
#include "file1.h" int main() { printstr(); printstr(); printstr(); return 0; }
输出结果:
normal_val = 0 static_val = 0
normal_val = 0 static_val = 1
normal_val = 0 static_val = 2