存储静态变量的位置(数据段或堆或BSS)?

时间:2010-03-25 15:34:12

标签: c static heap

我获得了有关静态变量存储的相互矛盾的意见。

意见1:“A 堆栈静态变量将其值存储在

意见2:“A 堆栈静态变量将其值存储在数据段中。”

我对这些相互矛盾的答案感到困惑。

哪里存储了静态变量?

我期待着参考文献的答案(教科书,真实的教程等)。

静态变量有两种类型:

  1. 在函数内声明的静态变量。
  2. global(声明的外部函数)静态变量。
  3. 我还想知道这两种变量的存储是否存在差异?

3 个答案:

答案 0 :(得分:10)

'堆栈变量'通常存储在'堆栈'中,它与程序的文本,数据,bss和堆部分分开。

你的问题的后半部分是关于'静态'变量,它们与堆栈变量不同 - 实际上,静态变量根本不存在于堆栈中。传统上,静态变量都将出现在程序的数据或bss部分中。对于现代编译器,如果数据是const限定的,那么数据可以存储在程序的文本部分中,这具有多种好处(包括强制执行的非可修改性)。

C标准没有规定存在堆栈,也没有bss部分。它只需要存储空间可用于具有适当持续时间的变量。

答案 1 :(得分:0)

启动应用程序时会分配堆栈内存,并且在执行应用程序期间始终保持相同的大小。它不存储在DATA段中,DATA段用于应用程序中使用的常量值(例如字符串文字)。

答案 2 :(得分:0)

本地和全局静态变量都保存在初始化的数据段

有两个数据段初始化数据段和单位化数据段。

单位数据段也称为BSS。

当我们说数据段时,默认情况下它初始化数据段,此部分从程序的加载图像中复制。 (所有全局变量和局部静态变量初始化为非零,即ini var1_global = 10;)

未初始化的数据segemnet又称BSS。在调用main()之前,此部分将初始化为零generall。所有单位化的全局本地静态都在这里。

http://www.geeksforgeeks.org/memory-layout-of-c-program/