深入c语言_作用域

来源:互联网 发布:ae软件图标 编辑:程序博客网 时间:2024/06/16 13:39

我们知道,C语言中变量的作用域有4种,我们不去讨论函数作用域,因为涉及到goto语句。剩下的三种作用域,代码块作用域,文件作用域,原型作用域。


代码块作用域:位于一堆花括号之间的所有语句是代码块,在代码块的开始位置声明的标识符的作用域就是代码块作用域。从声明开始,到所处的最小的右大画括号结束。

文件作用域:任何在代码块之外声明的标识符的作用域是文件作用域。从声明开始,到文件结尾结束。

原型作用域:在函数原型中声明的标识符的作用域是原型作用域。从声明开始,到有小括号结束。(只是函数原型声明时,定义时的形参属于代码块作用域)


标识符在声明时就决定了自己的作用域,作用域的告诉了我们变量允许你在哪些范围内使用。

我们先看一个例子

上面图片中的变量都是什么作用域我们不在分析,都可以看出来,不会的对照上面的方法。这个例子很简单,只是单纯的为了演示写的,下面我给出此代码的反汇编。

代码有什么疑问分析反汇编绝对可以解决。压栈出栈的细节我就不分析了,对应的反汇编也跳过,从movw $0x11,-0x4(%ebp)开始分析。这个变量的只是0x11,我们对应上面的c文件知道这个是变量blck,是代码块作用域,属于同一个类型的作用域还有下一条反汇编对应的变量block_scope,可以看除反汇编都是通过栈去寻址的,那么主函数没有结束,栈就不一直是当前的模样,内存是一直存在的,值也不会消失,但是当block_scope出了作用域时编译器不允许我们使用了,我们知道内存还是在的,也可以寻址得到,所以我们得出的结论是编译器做了手脚,不允许我们在通过变量名去访问那块内存了,换句话说就是变量对应的内存和值都在,只是编译器不能通过变量名寻址得到了。那句含有0x33的反汇编指令对应的变量就是file_scope,有文件作用域,我们发现它的寻址是一个常量地址,说明在编译期间,编译器直接给用一个地址去替代这个变量名,地址肯定是一直可以访问的,所以他一直可以访问,知道离开这个文件时,编译器又做了手脚。

原创粉丝点击