【C语言】数组初始化
数组初始化
正确答案是:第二个选项(可在程序编译阶段得到初值0)
以下是详细解析:
static关键字的作用:- 在 C 语言中,使用
static修饰的变量(无论是局部变量还是全局变量)存储在静态存储区。 - 静态存储区的变量拥有静态存储期(Static Storage Duration),这意味着它们在程序的整个运行期间都存在。
- 在 C 语言中,使用
- 默认初始化规则:
- 对于静态存储期的变量(包括
static局部变量和所有全局变量),如果在定义时没有显式地赋初值,编译器会自动将它们初始化为 0(对于数值型)或 NULL(对于指针)。 - 因此,数组
a中的所有元素都会被自动初始化为 0。这排除了选项 “不能得到确定的初值”。
- 对于静态存储期的变量(包括
- 初始化的时机(编译 vs 运行):
- 在 C 语言的理论和传统教学考试中,静态变量的初始化被认为是在“编译阶段”完成的。
- 这意味着编译器在生成可执行文件时,就已经为这些变量分配了空间并在数据段(如
.bss段或.data段)中记录了初始值。这与局部自动变量(auto)不同,后者是在程序运行进入函数、在栈上分配内存时才进行初始化的(即“运行时”)。
那没有被static修饰的a,是不是也是在编译时得到0?
这取决于变量 a 定义的位置。
但在绝大多数涉及 static 考点的题目语境下,我们通常是在对比 局部变量。
情况 1:如果在函数内部定义(局部变量)
答案是:不,它的初值是随机的(垃圾值),且分配发生在“运行时”。
如果代码是这样写的:
1 | |
- 初值: 它的值是未定义的(Undefined),也就是我们常说的“乱码”或“垃圾值”。内存里原来剩下什么数据,它就是什么数据。
- 时机: 它是运行时(Runtime)分配的。当程序运行到这个函数,并在栈(Stack)上开辟空间时,它才存在。
- 为什么不自动清零? 因为局部变量在栈上频繁创建和销毁,如果每次都自动清零,会严重拖慢程序运行速度(出于性能考虑,C语言设计者选择了不自动清零)。
情况 2:如果在函数外部定义(全局变量)
答案是:是,它会在编译阶段得到初值 0。
如果代码是这样写的:
1 | |
- 初值: 即使没有写
static,全局变量默认也是存储在静态存储区的。C 标准规定,凡是静态存储区的变量,默认初值都是 0。 - 时机: 编译阶段。这点和
static局部变量是一样的。
总结对比
| 变量定义方式 | 存储位置 | 默认初值 | 初始化时机 |
|---|---|---|---|
static int a... (题目中的情况) |
静态存储区 | 0 | 编译阶段 |
int a... (函数内,局部) |
栈 (Stack) | 随机/垃圾值 | 运行时 (进入函数时) |
int a... (函数外,全局) |
静态存储区 | 0 | 编译阶段 |
一句话记住核心考点:
只要是在函数里面写的数组,没加 static 就是乱码,加了 static 才是 0。
【C语言】数组初始化
http://example.com/2026/01/13/数组初始化/