程序存储器的未初始化数据段

时间:2015-06-19 22:04:40

标签: memory-management heap-memory

在未初始化的数据段中,内核将未初始化的变量初始化为0.

但是如果我们直接使用未初始化的变量(例如.int sum;而不是int sum = 0;)并在程序中使用它,例如sum = sum + n(n是任意数字),sum将获取任何垃圾值。

那么,如果内核已经被内核初始化为0,那么为什么sum将获取任何垃圾值?

1 个答案:

答案 0 :(得分:1)

您似乎在询问编译时初始化和运行时初始化之间的区别。在以下C代码中:

int i;
int main() {
    int j;
    return i + j;
}

i是一个全局范围的变量,因此默认初始化为零,这可以通过将其包含在程序的数据段中来实现。这将被写为二进制的初始值块,或者它将向加载器描述块的大小,并且当可执行文件启动时,加载器将使用零填充它。

但是,

j是一个局部变量,它将存在于寄存器或堆栈中。 C和C ++选择不默认初始化这些值,因此如果在不初始化它们的情况下访问它们,您将看到恰好位于其寄存器/堆栈位置的值。