常量变量存储在C中哪里?

我想知道常量变量的存储位置。 它和全局变量在同一个内存区域吗? 或者它在堆栈上?


它们如何存储是一个实现细节(取决于编译器)。

例如,在GCC编译器中,在大多数机器上,只读变量,常量和跳转表位于文本部分。


根据特定处理器所遵循的数据分段,我们有五个分段:

  • 代码段 - 仅存储代码,ROM
  • BSS(或由符号启动的块)段 - 存储初始化的全局变量和静态变量
  • 堆栈段 - 存储关于函数返回地址等的所有本地变量和其他信息
  • 堆段 - 所有动态分配发生在这里
  • 数据段 - 存储未初始化的全局和静态变量
  • 请注意,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!)

    请注意,我强制变量出现,因为我通过引用传递它们 - 大概是指向一个指向常量整数的函数。 如果地址从未被采用,那么jk可以完全从代码中优化。 要删除i ,编译器必须知道整个程序的所有源代码 - 它可以在其他翻译单元(源文件)中访问,因此不能轻易删除。 如果程序沉迷于共享库的动态加载,那么就不会这样 - 这些库中的一个可能依赖于该全局变量。

    (在风格上 - 变量ij应该有更长,更有意义的名字;这只是一个例子!)

    链接地址: http://www.djcxy.com/p/82509.html

    上一篇: Where are constant variables stored in C?

    下一篇: Where are global (statically compiled) variables located?