2016-07-10 103 views
6

所以我想在一個函數中創建一個數組,其大小由作爲參數的數字設置。這裏是一個例子:在沒有全局變量的情況下在C++中創建一個數組

void temp_arr (const int array_size) { 
    int temp_arr[array_size]; //ERROR array_size needs to be a constant value 
    //Then do something with the temp arr 
} 

即使參數是一個const int,它也不會工作。我想不使用全局常量,也不使用向量。我只是好奇,因爲我正在學習C++。我希望它能夠使每次調用函數時數組的大小都不相同。有沒有解決這個問題,或者我是否要創建一個const變量和函數調用之前的數組?

+0

'INT * temp_arr =新INT [ARRAY_SIZE] ... delete [] temp_arr;' – songyuanyao

+0

@songyuanyao這不是真的,因爲它會從靜態分配到動態分配。 – user2296177

+1

*並且不使用矢量。我只是好奇,因爲我正在學習C++。* - 所以你認爲'std :: vector'不是C++?爲什麼很多初學者認爲他們不應該使用或不能使用它,這與'vector'有什麼關係? – PaulMcKenzie

回答

7

使用模板功能:

template<std::size_t array_size> 
void temp_arr() 
{ 
    int temp_arr[ array_size ]; 
    // ...work with temp_arr... 
} 

然後,您可以調用函數的語法如下:

temp_arr<32>(); // function will work with a 32 int statically allocated array 

注意

array_size不同的值每次調用將實例一個新的功能。

+2

如果大小來自變量會怎麼樣? – Dmitri

+0

@Dmitri僅當它是'constexpr'時:'constexpr std :: size_t sz {32}; temp_arr ();'會工作。重點是,它必須在編譯時可用。 – user2296177

+0

這對我有用。我正在使用一個const int傳入模板。 – kingcobra1986

2

當您在此函數中傳遞值時,該值不是常量。定義一個數組必須用一個常量值來完成。儘管您已經使用了const int array_size,但它只會創建一個在該函數內保持不變的整數。所以在某種程度上,如果你在函數中傳遞一個變量值,它將它作爲一個變量。因此它會產生一個錯誤。是的,您需要創建一個常量並在函數調用期間傳遞它。

+0

我厭倦了在main中有一個const int並將其傳遞給函數。我也試着在函數中添加一個等於array_size的const int。你是說我應該創建一個全局變量? – kingcobra1986

+0

@ kingcobra1986你不必創建一個全局變量,查看我的答案。 – user2296177

+0

@ kingcobra1986如user2296177的回答所示,不需要創建全局變量。 –

0

可以使用:

int const size = 10; 
int array[size]; 

在C創建陣列++。但是,您不能使用

void temp_arr (const int array_size) { 
    int temp_arr[array_size]; 
} 

創建一個數組,除非編譯器支持將VLA作爲擴展。該標準不支持VLA。

參數類型中的const限定符僅在函數中使變量const - 您無法修改其值。但是,該值不一定在編譯時確定。

例如,使用可以調用函數:

int size; 
std::cout << "Enter the size of the array: "; 
std::cin >> size; 
temp_arr(size); 

由於值不能必然地在編譯時決定的,它不能被用來創建一個數組。

+2

參數類型中的'const'限定符不是「無用的」 –

0

如果沒有與內存問題讓我來告訴你一個簡單的方法: -

void temp_arr (const int array_size) 
    { 
     //lets just say you want to get the values from user and range will also be decided by the user by the variable array_size 

     int arr[100]; //lets just make an array of size 100 you can increase if according to your need; 
     for(int i=0; i<array_size ; i++) 
     { 
     scanf("%d",&arr[i]); 
     } 
    } 

我知道這是不適合初學者一個完美的解決方案,而只是一個簡單的方法。

+1

您應該包含一些代碼以防止緩衝區溢出,當它們的大小超過100時 –

+0

完全同意@ M.M它只是將想法提供給初學者。 – dreamBegin

+0

我也在學習編程的道路上,我只想分享我所知道的東西。 – dreamBegin

0

你可以使用一個std ::的unique_ptr:

void temp_arr(int array_size) 
{ 
    auto temp_arr = std::make_unique<int[]>(array_size); 
    // code using temp_arr like a C-array 
} 
相關問題