【问题标题】:uninitialized data segment of program memory程序存储器的未初始化数据段
【发布时间】:2015-06-19 22:04:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: memory-management heap-memory


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2011-05-14
      • 2014-09-11
      • 1970-01-01
      • 2023-03-30
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多