可變長陣列在GCC編譯器中的實現

2021-08-15 18:42:04 字數 675 閱讀 1239

在c99中新加入了對變長陣列的支援,即陣列的長度可以由某個非const變數來定義。可變陣列的空間大小直到程式執行時才能確定,因此只有程式在執行時才能為程式分配空間。在gcc編譯器程式會在執行時根據實際指定的大小(變數當前的值)調節esp的值,為陣列在棧上分配適當大小的空間。由於要在執行時才能為陣列分配空間,在開始分配空間之前空間的大小是不確定的,因此分配空間的起始位址也是不確定的(例如要在棧上分配兩個可變長陣列的情況下)。為了在以後的**中對可變長陣列的內容進行引用操作,程式必須通過某種方式獲取可變長陣列的位址。在gcc編譯器中會在相對於ebp固定的偏移量的棧上分配的乙個固定大小的區域(稱為內情向量)來記錄可變長陣列的資訊,如陣列的開始位址等。後繼**通過內情向量中的起始位址訪問可變長陣列。

因為陣列依靠在程式執行時動態的調整esp來分配空間,所以這種型別的陣列只能夠定義在棧內,不能夠定義在資料段上(全域性陣列,靜態陣列)。

#include 

<

stdio.h

>

#include 

<

stdlib.h

>

intmain()

else

}return0;

} 使用codeblocks編譯通過,在迴圈時使用c99標準**。編譯時要新增-std=c99引數,可以在settings選單的compiler and debugger下設定。

在Windows下使用gcc編譯器

mingw是指只用自由軟體來生成純粹的win32可執行檔案的編譯環境,它是minimalist gnu on windows的略稱。但是我配置的時候我電腦上安裝了codeblocks,已經自帶了mingw。在 系統屬性 高階 環境變數 系統變數 中 以下目錄都根據自己的電腦mingw所在位置不同而改...

CentOS中安裝gcc編譯器

centos中安裝gcc編譯器 今天要做老師布置的乙個網路任務時,發現在我安裝centos的時候忘記勾選了c語言這一塊的安裝項導致直接使用gcc o 命令無效。然後,在宿舍想使用yum連線網路安裝gcc,又發現,寬頻的共享功能被網路管理中心的老師給禁止了 好在天無絕人之路,柳暗花明又一村 只不過說,...

GCC編譯器的使用

看下面的例子 test.c include main char str i like linux i advices you jion in the linux world printf s n str exit 0 使用gcc編譯 輸入gcc c test.c得到目標檔案test.o。c命令表示對...