常量变量存储在C中哪里?
我想知道常量变量的存储位置。 它和全局变量在同一个内存区域吗? 或者它在堆栈上?
它们如何存储是一个实现细节(取决于编译器)。
例如,在GCC编译器中,在大多数机器上,只读变量,常量和跳转表位于文本部分。
根据特定处理器所遵循的数据分段,我们有五个分段:
请注意,BSS和数据段之间的区别在于前一个存储初始化了全局变量和静态变量,而后者存储了未初始化的变量。
现在,当我必须告诉存储常量变量的位置时,为什么我要谈论数据分段......这是有原因的......
每个段都有一个写保护区域,其中存储了所有的常量。
例如,
如果我有一个const int是局部变量,那么它存储在堆栈段的写保护区域中。 如果我有一个全局初始化const var,那么它存储在BSS中,如果我有一个未初始化的const var,那么它存储在数据段中...
总而言之,“const”只是一个数据QUALIFIER,这意味着首先编译器必须决定哪个段必须被存储,然后如果该变量是一个const,那么它有资格存储在写保护区该特定的细分。
我希望这会澄清大部分的误解...... :-)
欢迎任何进一步的评论... :-)
考虑一下代码:
const int i = 0;
static const int k = 99;
int function(void)
{
const int j = 37;
totherfunc(&j);
totherfunc(&i);
//totherfunc(&k);
return(j+3);
}
通常, i
可以存储在文本段(它是一个固定值的只读变量)。 如果它不在文本段中,它将被存储在全局变量旁边。 假定它被初始化为零,它可能在'bss'部分(通常分配零值变量)或'data'部分(通常分配初始化变量)。
如果编译器确信k
被使用(它可能是因为它是本地的单个文件),它可能根本不会出现在目标代码中。 如果对引用k
totherfunc()
的调用没有被注释掉,那么k
将不得不在某处被分配一个地址 - 它可能与i
在同一个分段中。
常量(如果它是一个常量,它仍然是一个变量?) j
很可能出现在传统C实现的堆栈中。 (如果你在comp.std.c新闻组中询问,有人会提到标准没有说自动变量出现在堆栈上;幸运的是,SO不是comp.std.c!)
请注意,我强制变量出现,因为我通过引用传递它们 - 大概是指向一个指向常量整数的函数。 如果地址从未被采用,那么j
和k
可以完全从代码中优化。 要删除i
,编译器必须知道整个程序的所有源代码 - 它可以在其他翻译单元(源文件)中访问,因此不能轻易删除。 如果程序沉迷于共享库的动态加载,那么就不会这样 - 这些库中的一个可能依赖于该全局变量。
(在风格上 - 变量i
和j
应该有更长,更有意义的名字;这只是一个例子!)
上一篇: Where are constant variables stored in C?
下一篇: Where are global (statically compiled) variables located?