簡體   English   中英

為什么在輸入 n 之前將數組的大小聲明為 n,第一次有效,第二次無效?

[英]Why declaring the size of an array as n, before inputting n, works for the first time but not the second time?

我正在解決一個問題,在輸入 n 的值之前,我將數組的大小聲明為 n,它適用於第一個測試用例,但不適用於第二個測試用例。 為什么?

PS:我在網上找不到任何相關信息。

這是代碼片段

    int n,arr[n];
    cin>>n;
int n,arr[n];
cin>>n;

這試圖定義一個 VLA(可變長度數組)。 但是,VLA 不是 C++ 的一部分。

這可能支持作為編譯器的擴展(例如g++支持作為擴展)。 在這種情況下,你仍然有問題。 定義數組時, n未初始化。 所以它會觸發未定義的行為。

在定義 VLA之前,您需要閱讀n

int n;
std::cin >> n;
int arr[n];

請注意 VLA 是在stack上分配的。 因此,如果n值足夠大,由於溢出(= 未定義的行為),您將有未定義的行為。 因此,最好避免使用 VLA。 您可以改用std::vector<int>

在您的示例中,您在初始化之前使用了n的值。 這是UB。

此外,c++ 中不允許可變長度c++ 例如

int n;
// compute n somehow
int arr[n];

也是不允許的。

如果您的程序不遵循語言規則,那么任何事情都可能發生,例如,有時工作,處理一些輸入,但不處理其他輸入,處理一些編譯器,但不處理其他,等等。基本上,你不能有任何對具有未定義行為的程序的期望。

暫無
暫無

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

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