首頁 > 後端開發 > C++ > 儘管數組綁定非常量,為什麼此 C 程式碼仍能編譯?

儘管數組綁定非常量,為什麼此 C 程式碼仍能編譯?

Barbara Streisand
發布: 2025-01-05 10:29:40
原創
348 人瀏覽過

Why Does This C   Code Compile Despite a Non-Constant Array Bound?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板