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

标签 memory-management heap-memory

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

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

那么,如果内核已经将总和初始化为 0,为什么总和还会采用任何垃圾值呢?

最佳答案

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

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

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

然而,

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

关于memory-management - 程序存储器的未初始化数据段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30947952/

相关文章:

java - 我如何找到导致内存泄漏的应用程序

c++ - 半动态多维存储对象

Javascript 数组访问(以字符串文字为键)- 空间复杂度

c++ - 如何在栈和堆对象之间转换

java - 生产中的性能问题

iphone - UIFont字体带名称: residing on heap and never destroyed

ios - 尝试替换NSString中的字符串的许多实例时,内存使用过多

c - 如何通过将正确的指针传递给 free() 来释放函数内分配的内存

objective-c - 我是否需要释放由 CFUUIDCreateString() 创建的 NSString?

c# - 随着时间的推移保存值(value)的方法