【发布时间】:2015-11-03 05:19:00
【问题描述】:
根据参考资料,其中许多都被说成是存储在数据段中。这意味着如果我在另外两个函数中声明了相同的静态变量名,则数据段包含的不仅仅是同一变量的声明。如果是这样,碰撞发生与否?
因此,存储静态变量的位置。我认为它存储在文本段中。因此,只有在函数的每次迭代中,静态中的值 变量保持不变。如果它在数据段中,就会发生冲突。如果它在堆栈中,则变量的范围会扩展到函数的生命周期,因此它无法维护存储在变量中的值。对吗?
【问题讨论】:
-
文本段存储程序代码。变量不能存储在文本段中,因为它们不是程序代码。 (cap.obvious)
-
全局静态变量,还是局部静态变量?正如你所知道的,这取决于实现(编译器),而 C 规范没有说明这一点(或“段”之类的东西)。
-
您的困惑源于您认为如果您在两个不同的函数中使用相同的名称,那么就会出现名称冲突。事实并非如此。没有这样的冲突。创建了两个不同的变量。克服这种误解,您的问题就会解决。
-
编译器为每个全局静态变量的名称添加前缀,从而使其唯一。前缀通常来自声明变量的文件的名称(这就是为什么在头文件中声明此类变量时可能会出现链接错误 - 如果头文件包含在多个源文件中,则同一个全局变量将被多次声明)。
-
避免你是否应该问这些问题。对于大多数编译器,初始化的静态变量存储在 .data 段中。如果您在全局或函数范围内未初始化(或初始化为 0)变量,它将被放置在 .bss 段中,并在运行时启动时设置为 0。