发布网友 发布时间:2024-09-06 09:00
共1个回答
热心网友 时间:2024-09-08 23:31
下面的C源程序执行后,输出什么样的结果呢?程序运行时,观察ci和csi的变化,有何特别之处?
ci是func()内部的局部变量,而带有static修饰的csi和csi2则是静态局部变量。全局变量i1和i2,以及带有static的is1和is2,它们的存储性质不同。
要理解局部变量、静态局部变量、全局变量和静态全局变量,需要深入到存储分配和机器指令层面。执行“objdump -S -D ab>ab.txt”命令,反汇编程序,分析相关部分,可以看到变量如何在目标文件中布局。
目标文件,Linux下的可执行文件格式,由ELF构成,包含多个节,如.text(代码)、.data(已初始化变量)、.bss(未初始化变量)和.rodata(只读数据)。在反汇编的ab.txt中,这些部分有所体现。
.text节存储用户代码,如main()和func()。全局变量i1和is1在.data节中分配,初始值分别为0x0000 0005和0x0000 0001。静态局部变量csi和csi2同样在.data节,csi的初始值为0x12345678。
.bss节用于未初始化的变量,如i2、is2和csi2,它们的初始值为0。.rodata节存放字符串" ci=%d,csi=%d\n",用于后续的输出。
目标文件的存储映射是虚拟地址,代码和数据映射到不同的内存区域。函数的栈帧在运行时动态分配,局部变量ci和csi的地址由栈帧决定,ci在每次func()调用时都会重新分配。
静态局部变量csi的分配与初始化不同,它在编译时就确定了地址和值。函数结束时,csi的值不会被清除,因此多次调用func()时,csi的值会累加i1的值。
总结起来,区别如下:
通过反汇编,可以看到全局变量和静态全局变量在不同文件中的同名处理,以及局部变量如何避免与全局变量冲突。