程序存储器的未初始化数据段
uninitialized data segment of program memory
在未初始化数据段中,内核将未初始化变量初始化为0。
但是如果我们直接使用一个未初始化的变量(例如 int sum; 而不是 int sum=0; )并在 sum=sum+n(n 是任何数字) 这样的程序中使用它,sum 将采取任何垃圾价值。
那么,如果内核已经将其初始化为 0,那么为什么总和会采用任何垃圾值?
您似乎在问编译时初始化和运行-时初始化之间的区别。在以下 C 代码中:
int i;
int main() {
int j;
return i + j;
}
i
是一个全局范围的变量,因此默认初始化为零,这是通过将它包含在程序的数据段中实现的。这将作为二进制初始值块写入,或者它将向加载程序描述块的大小,并且加载程序将在可执行文件启动时用零填充它。
然而,j
是一个局部变量,将存在于寄存器或堆栈中。 C 和 C++ 选择不默认初始化这些值,因此如果您在不初始化它们的情况下访问它们,您将看到恰好在它们 register/stack 位置的值。
在未初始化数据段中,内核将未初始化变量初始化为0。
但是如果我们直接使用一个未初始化的变量(例如 int sum; 而不是 int sum=0; )并在 sum=sum+n(n 是任何数字) 这样的程序中使用它,sum 将采取任何垃圾价值。
那么,如果内核已经将其初始化为 0,那么为什么总和会采用任何垃圾值?
您似乎在问编译时初始化和运行-时初始化之间的区别。在以下 C 代码中:
int i;
int main() {
int j;
return i + j;
}
i
是一个全局范围的变量,因此默认初始化为零,这是通过将它包含在程序的数据段中实现的。这将作为二进制初始值块写入,或者它将向加载程序描述块的大小,并且加载程序将在可执行文件启动时用零填充它。
j
是一个局部变量,将存在于寄存器或堆栈中。 C 和 C++ 选择不默认初始化这些值,因此如果您在不初始化它们的情况下访问它们,您将看到恰好在它们 register/stack 位置的值。