关键词不能为空

当前您在: 主页 > 英语 >

你的变量究竟存储在什么地方?

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:39
tags:

-

2021年3月3日发(作者:量筒)



你的变量究竟存储在什么地方?



作者:杨小华




我相信大家都有过这样的经历,在面试过程中,考官通常会给你一道题目,然后问你某个


变量存储在什么地方,在内存中是如何存储的等等一系列问题。不仅仅是在面试中,学校里面的


考试也会碰到同样的问题。




如果你还不知道答案,请接着往下看。接下来,我们将在


Lin ux


操作系统上,以


GCC



译器为例来讲解变量的存储。




在计算机系统中,目标文件通常有三种形式:



1.



可重定位的目 标文件:


包含二进制代码和数据,与其他可重定位目标文件合并起来,

< br>创建一


个可执行目标文件。



2.



可执行的目标 文件:包含二进制代码和数据,其形式可以被直接拷贝到存储器中并执行



3.



共享目标文件 :一种特殊的可重定位目标文件,即我们通常所说的动(静)态链接库



一个典型的可重定位目标文件如下图所示:




高地址



节头部表



.strtab



.line



.debug



.



.



.sym


tab



.bss



.data



3




.rodata



.text



1




ELF





0




1< /p>


典型的


ELF


可重定位目标文件(数字代 表索引)




夹在


ELF


头和节头部表之间的都是节(


sect ion


),各个节的意思如下:





.text



.rodata



.data



已编译程序的机器代码



只读数据,如


pintf



switch

< p>
语句中的字符串和常量值



已初始化的全局变量



含义



.bss



未初始化的全局变量



.sym


tab



符号表,存放在程序中被定义和引用的函数和全局变量的信息



.



当链接器吧这个目标文件和其他文 件结合时,


.text


节中的信息需修改



.



被模块定义和引用的任何全局变量的信息



.debug



.line



.strtab



一个调试符号表。



原始


C


程序的行号和


.text


节中机器指令之间的映射



一个字符串表,其内容包含


.systab



.debug


节中的符号表




对于


static


类型的变量,


gc c


编译器在


.data



.bss


中为每个定义分配空间,


并在


.sym


tab


节中创建一个有唯一名字的本地链接 器符号。对于


malloc


而来的变量存储在堆(


heap


)中,


局部变量都存储在栈(


stack


)中。




下面我们以实际的例子来分析变量的存储:



#include



#include



#include





int z =


9;



int a;



static int b =


10;



static int c;



void swap(int* x,int* y)



{



int temp;



tem


p=*


x;



*x=


*y;



*y=


temp;



}





int m


ain()



{



int x=4,y=5;



swap(&x,&y);



prin tf(“x=%d,y=%d,z=%d,w=%d



n”,x, y,z,b);



return 0;



}





根据以上题目和理论知识,我们可以推断出:



变量



a



b



c



x



y



tem


p



z



swap



main



x=……



存储区域



.bss



.data



.bss



stack



stack



stack



.data



.text



.text



.rodata




我们将从汇编代码和符号表中来分析以上答案是否正确。我们首先来看该程序的汇编代


码:




.file



.globl z



.data


#


数据段



.align 4



.type


z, @object



.size z, 4



z:



.long


9



.align 4



.type


b, @object



.size b, 4



b:



.long


10



.text


#


代码段



.globl


swap



.type


swap, @function



swap:




pushl


%ebp


-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:39,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/699968.html

你的变量究竟存储在什么地方?的相关文章