静态局部变量通过在函数内部使用关键字 static 定义。与普通局部变量不同,它在函数调用之间保存其值,并且仅初始化一次。该变量在整个程序生命周期内存在,但仅在其函数内部可见。
普通局部变量:
void func() { int count = 0; // 每次都初始化 count++; printf("%d ", count); }
每次输出 — 1。
静态局部变量:
void func() { static int count = 0; // 仅初始化一次 count++; printf("%d ", count); }
在连续调用时输出:1, 2, 3, ...
使用: 适合用于计算函数调用次数、缓存简单值。
"静态局部变量在函数退出后会被销毁吗?下一次调用函数时,它的值会发生什么?"
很多人回答会销毁,但实际上并不是这样。
正确答案: 静态局部变量在整个程序生命周期内存在。它在函数调用之间保存其值,并且仅在第一次进入函数时(或在main之前)初始化一次。
故事1
在一个项目中,测量模块入口时间的指标,通过一个函数记录每次入口。将 int counter = 0; 与 static int counter = 0; 混淆 — 函数总是返回1,统计数据变得毫无用处。
故事2
在一个非线程安全的服务中,使用静态变量在多个线程中调用的函数。这导致了竞争条件和偶然的不正确结果。没有考虑到共享内存没有保护。
故事3
将指向动态分配的内存的指针存储在静态变量中进行缓存。重新启动函数时未释放旧内存:每次调用时都出现内存泄漏。