2016-08-14 80 views
2

這是我的一段代碼。如何在C++ 11標準中初始化動態大小的數組?

int** n; 
    for (int i = 0; i < N; ++i){ 
     int size; 
     cin >> size; 
     int* n[i] = new int[size]; //line 13 
     for (int j = 0; j < size; ++j){ 
      cin >> n[i][j]; 
     } 
    } 

這是在編譯期間彈出的錯誤。

solution.cc: In function 'int main()':

solution.cc:13:33: error: array must be initialized with a brace-enclosed initializer

int* n[i] = new int[size];

我意識到這可以使用矢量來完成,因爲它們更好地動態處理內存。但我不允許使用矢量來應對這個挑戰。我被允許使用的唯一標題是「iostream」。

,我讀了,在C++ 11中,語法已修改爲新的:

p = new T [N] {initializer1, ..., initializerN}; 

來源:https://en.wikipedia.org/wiki/New_and_delete_(C%2B%2B)#Overview

但我的代碼仍然會產生類似的變種同樣的錯誤。

有沒有辦法完全繞過初始化錯誤?如果不是,則假定這些值被初始化爲,最好是相同的值。

+5

'n [i] = new int [size];'會讓你通過編譯器錯誤。但是,'n'是一個未初始化的指針,並且您試圖對其進行解引用,因此您的程序會顯示未定義的行爲。 –

+1

Igor - 將此添加爲答案 – doron

回答

12

我相信(恕我直言)你並不想真正的問題。

您已經申報了雙指針:

int** n; 

然後你忘了爲指針數組,喜歡的東西分配內存:

n = new int*[N] 

這一步是必要的,然後才能分配內存數組中的每個指針(指針)。

而且,我相信你行應該是:

n[i] = new int[size] 

否則你重新聲明N + I的類型。

2

幫你一個忙,停止使用原始指針。代替原陣列儘可能的使用std::vector - 東西沿着這些路線:

std::vector<std::vector<int>> n(N); 
for (int i = 0; i < N; ++i){ 
    int size; 
    cin >> size; 
    n[i].resize(size); 
    for (int j = 0; j < size; ++j){ 
     cin >> n[i][j]; 
    } 
} 
+7

>我意識到這可以使用矢量來完成,因爲它們在動態處理內存方面非常好。但我不允許使用矢量來應對這個挑戰。 – Shoe

+4

不幸的是,這個答案沒有解釋OP代碼的實際錯誤。因此,我認爲這對任何想學習C/C++的人都沒有幫助。 – cmaster

6

這應該可以解決您的問題。

int** n = new int*[N]; 

for (int i = 0; i < N; ++i){ 
    int size; 
    cin >> size; 
    n[i] = new int[size]; 

    for (int j = 0; j < size; ++j){ 
     cin >> n[i][j]; 
    } 
}