【C语言】数组初始化

数组初始化

正确答案是:第二个选项(可在程序编译阶段得到初值0)

以下是详细解析:

  1. static 关键字的作用:
    • 在 C 语言中,使用 static 修饰的变量(无论是局部变量还是全局变量)存储在静态存储区
    • 静态存储区的变量拥有静态存储期(Static Storage Duration),这意味着它们在程序的整个运行期间都存在。
  2. 默认初始化规则:
    • 对于静态存储期的变量(包括 static 局部变量和所有全局变量),如果在定义时没有显式地赋初值,编译器会自动将它们初始化为 0(对于数值型)或 NULL(对于指针)。
    • 因此,数组 a 中的所有元素都会被自动初始化为 0。这排除了选项 “不能得到确定的初值”。
  3. 初始化的时机(编译 vs 运行):
    • 在 C 语言的理论和传统教学考试中,静态变量的初始化被认为是在“编译阶段”完成的
    • 这意味着编译器在生成可执行文件时,就已经为这些变量分配了空间并在数据段(如 .bss 段或 .data 段)中记录了初始值。这与局部自动变量(auto)不同,后者是在程序运行进入函数、在栈上分配内存时才进行初始化的(即“运行时”)。

那没有被static修饰的a,是不是也是在编译时得到0?

这取决于变量 a 定义的位置

但在绝大多数涉及 static 考点的题目语境下,我们通常是在对比 局部变量

情况 1:如果在函数内部定义(局部变量)

答案是:不,它的初值是随机的(垃圾值),且分配发生在“运行时”。

如果代码是这样写的:

1
2
3
4
void myFunction() {
int a[3][4]; // 没有 static,也没有初始化
// ...
}
  1. 初值: 它的值是未定义的(Undefined),也就是我们常说的“乱码”或“垃圾值”。内存里原来剩下什么数据,它就是什么数据。
  2. 时机: 它是运行时(Runtime)分配的。当程序运行到这个函数,并在栈(Stack)上开辟空间时,它才存在。
  3. 为什么不自动清零? 因为局部变量在栈上频繁创建和销毁,如果每次都自动清零,会严重拖慢程序运行速度(出于性能考虑,C语言设计者选择了不自动清零)。

情况 2:如果在函数外部定义(全局变量)

答案是:是,它会在编译阶段得到初值 0。

如果代码是这样写的:

1
2
3
4
5
int a[3][4]; // 写在所有函数外面

int main() {
// ...
}
  1. 初值: 即使没有写 static,全局变量默认也是存储在静态存储区的。C 标准规定,凡是静态存储区的变量,默认初值都是 0。
  2. 时机: 编译阶段。这点和 static 局部变量是一样的。

总结对比

变量定义方式 存储位置 默认初值 初始化时机
static int a... (题目中的情况) 静态存储区 0 编译阶段
int a... (函数内,局部) 栈 (Stack) 随机/垃圾值 运行时 (进入函数时)
int a... (函数外,全局) 静态存储区 0 编译阶段

一句话记住核心考点:

只要是在函数里面写的数组,没加 static 就是乱码,加了 static 才是 0。


【C语言】数组初始化
http://example.com/2026/01/13/数组初始化/
作者
王柏森
发布于
2026年1月13日
许可协议