static使用不陌生,但使用是否恰当不好说。最近有一个地方怀疑是static的问题,重新复习下:

1.不管是局部变量,还是全局变量,只要加了static,顾名思义,就是将变量存储于静态存储区中。

代码实验如下:

#include <stdio.h>
 
static int g_var;
 
int main()
{
    int a = 0;
    static int l_var;
    printf("&a = %p\n", &a);
    printf("&g_var = %p\n", &g_var);
    printf("&l_var = %p\n", &l_var);
    return 0;
}

打印结果如下:

 

 从结果可以看到,l_var和a定义的位置虽然紧挨着,但他们的地址不在同一片区域中。两个静态变量是存储在同一块区域的。

2.static局部变量的作用域,是在局部作用域内(即花括号内)

代码实验如下:

#include <stdio.h>
 
void func()
{
   static int l_var = 5;
}
int main()
{
    func();
    printf("l_var = %d\n", l_var);
    return 0;
}

编译结果如下:

 

 

3.static全局变量和函数作用域是在本文件中,在同一个程序别的文件中是不能访问的

代码实验如下:

//file1.c中定义如下:
#include <stdio.h>
 
static int g_var;
 
int main()
{
    g_var = 5;
    printf("g_var = %d\n", g_var);
    return 0;
}
 
//file2.c中定义如下:
void test01()
{
    g_var = 6;
}

 编译结果如下:

 

 总的来说

(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。

(6)static修饰的全局变量和静态变量的区别就是作用域不同,静态布局变量在函数内部,静态全局变量在文件夹内,都不可被文件夹之外访问,extern也不行。

(7)static 函数与普通函数有什么区别:static 函数在存中只有一份,普通函数在每个被调用中维持一份拷贝程序的局部变量存在于(堆栈)中,全局变量存在于 (静态区)中,动态申请数据存在于(堆)中。extern 全局变量、static 全局变量和 static 局部变量的生存期都是“永久”,区别只是可见域不同。extern 全局 变量可见区域是工程,static 全局变量可见区域是文件,而 static 局部变量的可见区域是块。从代码维护角度来看,对extern 变量的修改可能会影 响所有代码,对 static 全局变量的修改可能影响一个文件 中的代码,而对static 变量的修改 可能影响一个块的代 码;因此在选择变量类型时,优先级是 static 局 部>static 全局>extern 全局。

原文链接:https://blog.csdn.net/west_gege/article/details/120140420

https://blog.csdn.net/songxukeno1/article/details/127712256

https://blog.csdn.net/qq_51050614/article/details/124068531   -------------------extern 和static不能同时使用的例子

posted on 2023-03-02 10:46  shiyuan310  阅读(43)  评论(0编辑  收藏  举报