下面这段话来自百度百科:
静态局部变量属于静态存储方式,它具有以下特点:
(1) 静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2) 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3) 允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
(4) 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
既然静态局部变量的生存期为整个源程序,那么能不能通过指针在作用域之外操作静态局部变量呢?
然后写了几行测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *func_static(const char *str)
{
int length;
static char static_str[1024]; // 定义函数作用域的静态局部变量
printf("func_static: %s\n", static_str);
length = sizeof(static_str) > strlen(str) ? strlen(str) : sizeof(static_str);
strncpy(static_str, str, length);
return static_str; // 返回静态局部变量的指针
}
int main(int argc, char *argv[])
{
char *pstr;
pstr = func_static("Hello world!");
printf(" main: %s\n", pstr);
printf("Change\n");
pstr[0] = 'h'; // 修改静态局部变量的值
func_static("0");
exit(0);
}
该程序在func_static函数中定义了一个函数作用域的局部静态变量,然后在作用域外(main函数中)通过指针输出该局部静态变量的内容,之后又在作用域外通过指针对该静态变量的值进行了修改。
编译并运行程序:
$ gcc main.c -Wall
$ ./a.out
func_static:
main: Hello world!
Change
func_static: hello world!
编译时无错误和警告信息,程序正确运行,并且静态局部变量的值被修改。
按照此测试结果,那么“退出该函数后, 尽管该变量还继续存在,但不能使用它”这种说法应该可以说不十分准确。