簡體   English   中英

如何根據參數的大小在函數內部聲明數組?

[英]How can I declare an array inside a function according to the size of a parameter?

這是我嘗試過的:

int fun1(vector<int> s)
{ 
    const int n = s.size();
    int arr[n]; //<----want to declare an array of length s.size()
}

但這告訴我n不是常數表達式,所以我不能用它來聲明數組大小。 但是,如果我嘗試:

int fun1(vector<int> s)
{ 
    const int n = 10;
    int arr[n]; //<-----this works
}

那很好 即使我將向量設置為const類型,它仍然不會將大小識別為常量表達式。 我該怎么辦?

通過int arr[N];聲明數組int arr[N]; 大小N必須在編譯時確定(某些編譯器擴展除外,它們也允許您在運行時定義它們)。 順便說一句,您可以做到:

std::unique_ptr<int[]> arr (new int [n]);

// ... or ...

std::vector<int> arr(n);

當你這樣聲明一個數組

int arr[n];

編譯器將在堆棧上為其分配內存。 在這種情況下,C ++標准要求n在編譯時是已知的,即它必須是const

您問題的答案是像這樣在運行時從堆中獲取內存:

int* arr = new int[n];

在這種情況下,內存是在運行時分配的,因此直到運行時才需要知道n的值。 如果使用這種方法,請別忘了在完成以下操作后釋放內存:

delete [] arr;

但是,正如評論所建議的那樣,使用std::vector<int>幾乎可以肯定是一種更好的方法。 除非您有充分的理由不這樣做,否則我會同意的。

為此,C ++具有std::vector<int>(n) ,它保留了傳統C數組的大部分語義,但也帶來了很多好處(動態分配是一種,調整大小是另一種,算法支持是另一種) )。 即使您的基礎代碼需要C數組,您仍然可以使用該向量並向下傳遞第一個元素的地址(保證它們是連續的)。

通常, std::vector使用堆作為基礎存儲,因此一方面可以更好地保護其免受堆棧溢出(雙關語)的影響,另一方面,您的代碼現在使用動態分配。

暫無
暫無

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

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