You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组的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想表达的是:

  1. 字符串字面量在C中的本质是一个以'\0'结尾的字符数组,比如"test"等价于{'t','e','s','t','\0'}。
  2. 编译器会把字符串字面量存储在静态存储区,相当于隐式给这个字符数组加上了static修饰。这意味着它的生命周期是整个程序运行期间,而且只会被初始化一次。

举个实际的例子:当你写char *p = "hello";,p其实是指向一个静态字符数组static char[6] = {'h','e','l','l','o','\0'}的指针。
另外要注意,字符串字面量通常是只读的(大部分编译器会把它放到只读数据段),如果你尝试修改它的内容(比如p[0] = 'H'),会触发未定义行为,程序可能崩溃或出现异常结果。同时,相同的字符串字面量可能会被编译器优化成同一个内存地址,减少内存占用。

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:01:30