可能是重复问题:
为什么全局变量和静态变量会被初始化为它们的默认值?
请看代码:
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
输出
0 8683508
这里将 'a' 初始化为 '0',但是将 'i' 初始化为一个“垃圾值”。为什么?
可能是重复问题:
为什么全局变量和静态变量会被初始化为它们的默认值?
请看代码:
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
输出
0 8683508
这里将 'a' 初始化为 '0',但是将 'i' 初始化为一个“垃圾值”。为什么?
这是由于根据C标准规定的。原因在于效率:
静态变量在编译时初始化,因为它们的地址是已知且固定的。将其初始化为0
不会产生运行时成本。
自动变量在不同调用中具有不同的地址,并且每次需要在运行时进行初始化,会产生运行时成本,但这可能是不必要的。如果需要初始化,则请进行请求。
0
对吧? - Grijesh Chauhanmain
程序启动之前被设置为零。这是一次性的操作,与针对本地变量的“每次调用函数”操作相比。 - Jonathan Lefflerglobal
和 static
变量在初始化时被存储在数据段 (DS) 中,在未初始化的情况下由符号 (BSS) 块开头存储。
这些变量具有固定的内存位置,并且内存是在编译时分配的。
因此,global
和 static
变量的默认值为 '0'
。
而 auto
变量存储在堆栈上,它们没有固定的内存位置。
内存是在运行时分配给 auto
变量,而不是在编译时分配。因此,auto
变量的默认值为垃圾值。
你选择了简单的变量,但请考虑:
void matrix_manipulation(void)
{
int matrix1[100][100];
int matrix2[100][100];
int matrix3[100][100];
/* code to read values for matrix1 from a file */
/* code to read values for matrix2 from a file */
/* code to multiply matrix1 by matrix2 storing the result in matrix3 */
/* code to use matrix3 somehow */
}
如果系统将数组初始化为0,那么这些努力将会白费;初始化会被函数的其余部分覆盖。C语言尽可能避免隐藏的成本。
全局变量是在 main
函数开始之前分配和初始化的,而局部变量则随着程序实例在堆栈上生成。