堆栈段与未初始化数据段之间的差异

时间:2017-11-15 07:21:33

标签: c

我试图在c中找到内存分配。

根据following link,堆栈和未初始化的数据段是不同的,并且本地函数的未初始化数据转到未初始化的数据段。

如果是这种情况,那么在具有未初始化的局部变量的代码中,存储在堆栈段中的是什么?它是空的吗?

2 个答案:

答案 0 :(得分:2)

我不建议阅读" geeksforgeeks"教程。你有一些误解。

他们称之为"未初始化的数据",.bss段,实际上是静态存储持续时间变量零初始化的存储。包括任何明确初始化为零值的变量。 可以找到静态存储持续时间和不同公共段的解释,以及示例here

仅具有静态存储持续时间的变量最终位于.bss.data。无论是否初始化,局部变量总是在堆栈或CPU寄存器中结束。

(请注意,这些都不是ISO C标准规定的,而是由行业事实上的标准规定。)

答案 1 :(得分:1)

  

本地函数的未初始化数据转到未初始化的数据段。

嗯,这并不完全正确。

仔细阅读,(from the same link,强调我的)

  

[...]未初始化的数据从数据段的末尾开始,包含所有全局变量和静态变量,这些变量和静态变量初始化为零或源代码中没有显式初始化。 [。 ..]

因此,自动存储变量仍然存在于堆栈段中,而不管它们是否已初始化。

这就是说,谨慎,这是"典型的记忆表示",不是普遍的。对于此事,C标准并未要求拥有堆栈段(或任何其他段)。