C--静态变量和静态函数static

1. 静态局部变量:

复制代码
#include <stdio.h>

//在本地变量定义时加上static修饰符就成为静态本地变量 
//当函数离开的时候,静态本地变量会继续存在并保持其值
//静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
//静态本地变量的实质是特殊的全局变量 
//静态本地变量具有全局的生存期,函数内的局部作用域

void f(void) {
    static int a = 1;
//静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);    
    //它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它
    a += 5;
    printf("%d\n", a);
}


int main()
{
    f();
    f();
    f();

    return(0);
}
复制代码

 

c/c++的内存分布,以及static所在的区间:

对于一个完整的程序,在内存中的分布情况如下图:

1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间

2.堆区:程序员分配并释放的区域,像malloc(c),new(c++) 

3.全局数据区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放

4.代码区

2.静态全局变量:

全局变量、静态全局变量这两者在存储方式上并无不同,区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它

 

3.静态函数: 

准确的说,静态函数跟静态全局变量的作用类似 


static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用

定义静态函数有以下好处:
  <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
  <2> 静态函数不能被其他文件所用。

 

 

 

 

 

posted @   天子骄龙  阅读(1424)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航