数组的static存储类作用是什么?及对C语言字符串static存储类的疑问
static存储类修饰数组的作用
- 延长生命周期:普通局部数组在函数执行完毕后就会被销毁,内存被释放。用static修饰后,数组会被放到静态存储区,从程序启动到结束一直存在。下次调用包含该数组的函数时,数组会保留上一次调用后的状态。比如:
void add_count() { static int cnt_arr[2] = {0}; cnt_arr[0]++; printf("当前计数:%d\n", cnt_arr[0]); }
每次调用add_count,cnt_arr[0]都会累加,不会每次都重置为0。
限制访问范围:如果是在文件全局作用域用static修饰数组,这个数组只能被当前文件内的代码访问,其他文件没法通过
extern关键字引用它,能有效避免不同文件间的命名冲突。默认零初始化:static数组如果没有显式初始化,编译器会自动把所有元素初始化为0;而普通局部数组不初始化的话,元素值是随机的垃圾值。比如
static int nums[3];,三个元素默认都是0。
解释《The C Programming Language》中的字符串表述
先看原文引用:
字符串的类型为‘字符数组’且存储类为static……
这里特指的是字符串字面量(比如"hello world"这类用双引号包裹的字符串),K&R想表达的是:
- 字符串字面量在C中的本质是一个以'\0'结尾的字符数组,比如
"test"等价于{'t','e','s','t','\0'}。 - 编译器会把字符串字面量存储在静态存储区,相当于隐式给这个字符数组加上了static修饰。这意味着它的生命周期是整个程序运行期间,而且只会被初始化一次。
举个实际的例子:当你写char *p = "hello";,p其实是指向一个静态字符数组static char[6] = {'h','e','l','l','o','\0'}的指针。
另外要注意,字符串字面量通常是只读的(大部分编译器会把它放到只读数据段),如果你尝试修改它的内容(比如p[0] = 'H'),会触发未定义行为,程序可能崩溃或出现异常结果。同时,相同的字符串字面量可能会被编译器优化成同一个内存地址,减少内存占用。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

