簡體   English   中英

可變大小數組的范圍

[英]Scope of variably sized array

這總是能按預期運行嗎?

char *x;
if (...) {
    int len = dynamic_function();
    char x2[len];

    sprintf(x2, "hello %s", ...);

    x = x2;
}

printf("%s\n", x);
// prints hello


編譯器(在我的情況下為GCC)如何在C和C ++中的每一個中實現大小可變的數組?

x2if語句的作用域內是局部的,您可以使用指針在它之外訪問它。 這導致不確定的行為。

順便說一下,VLA在C11中已成為可選屬性,並且從未成為C ++的一部分。 因此最好避免這種情況。

范圍在這里說明:

跳出或超出陣列名稱范圍會取消分配存儲空間。 不允許跳入范圍; 您會收到一條錯誤消息。

在您的情況下,數組超出范圍。

否,原因有兩個:

C ++:該代碼不是有效的C ++。 C ++中的數組必須具有編譯時常量大小。

C:否,因為數組僅生存到聲明它的塊的末尾,因此取消引用x是未定義的行為。

從C11,6.2.4 / 2:

如果在其生存期之外引用對象,則行為是不確定的。

6.2.4 / 7表示可變長度數組從聲明開始一直到其封閉范圍的結尾:

對於確實具有可變長度數組類型的對象,其生存期從對象的聲明開始,直到程序執行離開聲明的范圍為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM