深入c语言_作用域
我們知道,C語言中變量的作用域有4種,我們不去討論函數作用域,因為涉及到goto語句。剩下的三種作用域,代碼塊作用域,文件作用域,原型作用域。
代碼塊作用域:位于一堆花括號之間的所有語句是代碼塊,在代碼塊的開始位置聲明的標識符的作用域就是代碼塊作用域。從聲明開始,到所處的最小的右大畫括號結束。
文件作用域:任何在代碼塊之外聲明的標識符的作用域是文件作用域。從聲明開始,到文件結尾結束。
原型作用域:在函數原型中聲明的標識符的作用域是原型作用域。從聲明開始,到有小括號結束。(只是函數原型聲明時,定義時的形參屬于代碼塊作用域)
標識符在聲明時就決定了自己的作用域,作用域的告訴了我們變量允許你在哪些范圍內使用。
我們先看一個例子
上面圖片中的變量都是什么作用域我們不在分析,都可以看出來,不會的對照上面的方法。這個例子很簡單,只是單純的為了演示寫的,下面我給出此代碼的反匯編。
代碼有什么疑問分析反匯編絕對可以解決。壓棧出棧的細節我就不分析了,對應的反匯編也跳過,從movw $0x11,-0x4(%ebp)開始分析。這個變量的只是0x11,我們對應上面的c文件知道這個是變量blck,是代碼塊作用域,屬于同一個類型的作用域還有下一條反匯編對應的變量block_scope,可以看除反匯編都是通過棧去尋址的,那么主函數沒有結束,棧就不一直是當前的模樣,內存是一直存在的,值也不會消失,但是當block_scope出了作用域時編譯器不允許我們使用了,我們知道內存還是在的,也可以尋址得到,所以我們得出的結論是編譯器做了手腳,不允許我們在通過變量名去訪問那塊內存了,換句話說就是變量對應的內存和值都在,只是編譯器不能通過變量名尋址得到了。那句含有0x33的反匯編指令對應的變量就是file_scope,有文件作用域,我們發現它的尋址是一個常量地址,說明在編譯期間,編譯器直接給用一個地址去替代這個變量名,地址肯定是一直可以訪問的,所以他一直可以訪問,知道離開這個文件時,編譯器又做了手腳。
總結
- 上一篇: oracle 安装后密码,oracle
- 下一篇: 【SUMO学习】初级 OSMWebWiz