C 陣列綁定為常數表達式:程式碼中的異常
在C 中,陣列表達式通常必須是常數綁定通常必須是常數綁定,確保數組的大小在編譯期間是已知的。然而,在某些情況下,這條規則似乎被違反了。讓我們探討一個具體的範例:
#include <iostream> using namespace std; int main() { int n = 10; int a[n]; // Array a with size n for (int i = 0; i < n; i++) { a[i] = i + 1; cout << a[i] << endl; } return 0; }
這段程式碼在 Mac 上使用 Xcode4 編譯時,執行時沒有任何錯誤。儘管數組 a 的大小不是常數表達式,但程式碼仍然有效。
說明:可變長度數組 (VLA)
原因代碼的工作原理是由於 C99 中引入的稱為可變長度數組 (VLA) 的功能。 VLA 允許在執行時間確定陣列的大小,這與必須在編譯時知道大小的常規陣列不同。
在提供的程式碼中,n 不是常數表達式,而是變數。不過,由於 Xcode4 中的編譯器支援 VLA,因此可以在運行時根據 n 的值為數組 a 分配記憶體。
堆疊分配與堆疊分配
需要注意的是,VLA 是在堆疊上分配的,類似於靜態數組。這意味著當程式進入和退出聲明 VLA 的函數時,會自動分配和釋放數組的記憶體。此行為與在堆上分配的常規數組不同,必須使用指標手動管理。
以上是儘管數組綁定非常量,為什麼此 C 程式碼仍能編譯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!