【问题标题】:Static variables in global and local scope in CC中全局和局部范围内的静态变量
【发布时间】:2023-03-29 15:23:02
【问题描述】:

我有以下 C 程序

 #include <stdio.h> 

 static int aa = 10;          

 void func(){
    static int aa = 9;
    printf("%d\n",aa);

}
int main()
{ 
    func();
    return 0;
}

输出为 9。

当使用 nm 命令查看输出时,我得到了这个

0000000000601038 d aa
000000000060103c d aa.2286
0000000000601040 B __bss_start
0000000000601040 b completed.7585
0000000000601028 D __data_start
0000000000601028 W data_start
0000000000400460 t deregister_tm_clones
00000000004004e0 t __do_global_dtors_aux
0000000000600e18 t __do_global_dtors_aux_fini_array_entry
0000000000601030 D __dso_handle
0000000000600e28 d _DYNAMIC
0000000000601040 D _edata
0000000000601048 B _end
00000000004005d4 T _fini

在前两行中表示两个变量都在数据段中,但第二行中的 2286 是什么。说明什么?

【问题讨论】:

    标签: c symbols nm


    【解决方案1】:

    表示func范围内的局部静态变量aa,该变量只被系统的动态加载器初始化一次。从翻译单元外部看不到它,但它也在 data 段中,因为这是一开始就进行快速初始化的地方。

    索引 2286 是随机生成的,这样如果你在不同的局部范围内静态声明多个名为 aa 的变量,能够相互区分,同时保持全部在 data 段中。

    【讨论】:

    • 你确定是随机生成的吗?我编译了很多次并对其进行了 nm-ed 并得到了相同的数字。
    • @parerariddle:它可能是确定性生成的,但选择的值不容易预测。
    • 好的。有没有其他方法可以查看像 nm 命令这样的可执行文件中的符号?
    猜你喜欢
    • 2013-02-15
    • 2015-10-04
    • 1970-01-01
    • 2017-03-05
    • 2014-10-25
    • 2012-08-24
    • 2016-11-13
    • 2011-06-11
    • 2010-10-07
    相关资源
    最近更新 更多