深入c语言_作用域
来源:互联网 发布:ae软件图标 编辑:程序博客网 时间:2024/06/16 13:39
我们知道,C语言中变量的作用域有4种,我们不去讨论函数作用域,因为涉及到goto语句。剩下的三种作用域,代码块作用域,文件作用域,原型作用域。
代码块作用域:位于一堆花括号之间的所有语句是代码块,在代码块的开始位置声明的标识符的作用域就是代码块作用域。从声明开始,到所处的最小的右大画括号结束。
文件作用域:任何在代码块之外声明的标识符的作用域是文件作用域。从声明开始,到文件结尾结束。
原型作用域:在函数原型中声明的标识符的作用域是原型作用域。从声明开始,到有小括号结束。(只是函数原型声明时,定义时的形参属于代码块作用域)
标识符在声明时就决定了自己的作用域,作用域的告诉了我们变量允许你在哪些范围内使用。
我们先看一个例子
上面图片中的变量都是什么作用域我们不在分析,都可以看出来,不会的对照上面的方法。这个例子很简单,只是单纯的为了演示写的,下面我给出此代码的反汇编。
代码有什么疑问分析反汇编绝对可以解决。压栈出栈的细节我就不分析了,对应的反汇编也跳过,从movw $0x11,-0x4(%ebp)开始分析。这个变量的只是0x11,我们对应上面的c文件知道这个是变量blck,是代码块作用域,属于同一个类型的作用域还有下一条反汇编对应的变量block_scope,可以看除反汇编都是通过栈去寻址的,那么主函数没有结束,栈就不一直是当前的模样,内存是一直存在的,值也不会消失,但是当block_scope出了作用域时编译器不允许我们使用了,我们知道内存还是在的,也可以寻址得到,所以我们得出的结论是编译器做了手脚,不允许我们在通过变量名去访问那块内存了,换句话说就是变量对应的内存和值都在,只是编译器不能通过变量名寻址得到了。那句含有0x33的反汇编指令对应的变量就是file_scope,有文件作用域,我们发现它的寻址是一个常量地址,说明在编译期间,编译器直接给用一个地址去替代这个变量名,地址肯定是一直可以访问的,所以他一直可以访问,知道离开这个文件时,编译器又做了手脚。
- 深入c语言_作用域
- C语言_深入函数
- C语言32个关键字_作用域修饰符
- 深入c语言_链接属性
- 深入c语言_存储类型
- C语言-作用域
- C语言------作用域
- 20170128C语言提升01_数据本质和static和生命周期和作用域
- 深入c语言_变量特性的总结
- c语言变量作用域
- C语言变量作用域
- C语言变量作用域
- C语言-变量作用域
- C语言之作用域
- C#_方法与作用域
- C#_关于Using作用域问题
- C深入const作用
- 【linux c】c语言关键字作用及注意事项_学习笔记_013
- SHELL 的一些简单的用法
- Web前端-HeadFirst-笔记-Ch14-表单
- 633. Sum of Square Numbers
- JDBC之DatabaseMetaData
- ACM练习题(day001)
- 深入c语言_作用域
- 712总结
- 函数组织方式
- 一个合格的程序员应该读的30本书
- 原型模式
- 【Java web】get、put、post、delete请求方法总结
- CSDN日报20170712——《AI 大行其道,你准备好了吗?》 标签: csdn程序人生 2017-07
- SQL Developer12 中文+破解版
- More is better (并查集)