静态变量存储在哪里(在C / C ++中)?
在可执行文件的段(.BSS,.DATA,其他)中存储了哪些静态变量,以避免名称冲突? 例如:
foo.c: bar.c:
static int foo = 1; static int foo = 10;
void fooTest() { void barTest() {
static int bar = 2; static int bar = 20;
foo++; foo++;
bar++; bar++;
printf("%d,%d", foo, bar); printf("%d, %d", foo, bar);
} }
如果我编译这两个文件并将其链接到重复调用fooTest()和barTest的main,则printf语句将独立增加。 因为foo和bar变量对于翻译单元是本地的,所以是有意义的。
但分配的存储位置在哪里?
要清楚,假设是你有一个工具链可以输出ELF格式的文件。 因此,我认为,必须有一定的空间,为那些静态变量的可执行文件保留。
出于讨论的目的,我们假设我们使用GCC工具链。
你的静态位置取决于它们是否被初始化。 0初始化的静态数据进入.BSS(符号启动块),非0初始化数据进入.DATA
当一个程序被加载到内存中时,它被组织成不同的段。 其中一部分是数据段。 数据段进一步细分为两部分:
初始化数据段:所有全局,静态和常量数据都存储在此处。
未初始化的数据段(BSS):所有未初始化的数据都存储在此段中。
这里是解释这个概念的图表:
这里是解释这些概念的非常好的链接:
http://www.inf.udec.cl/~leo/teoX.pdf
实际上,变量是元组(存储,范围,类型,地址,值):
storage : where is it stored, for example data, stack, heap...
scope : who can see us, for example global, local...
type : what is our type, for example int, int*...
address : where are we located
value : what is our value
局部作用域可能意味着本地翻译单元(源文件),函数或块取决于其定义的位置。 要使变量对多个函数可见,它肯定必须位于DATA或BSS区域中(取决于是否分别初始化它们)。 然后将其范围限定为源文件中的所有功能或功能。
链接地址: http://www.djcxy.com/p/14471.html上一篇: Where are static variables stored (in C/C++)?
下一篇: What is a stack trace, and how can I use it to debug my application errors?