C++ 用new 動態創建多維數組

我們知道

char *a=new char[10];

可以創建一個長度爲10的數組。當把定值10換爲一個變量時,我們的程序也沒有任何問題,這時可成了名副其實的動態創建數組,如:

int n=10;

char *a=new char[n];

但我們怎麼動態創建一個多維數組呢?一定有人寫出來這樣的代碼:

//錯誤代碼

char **a=new char[10][10];

但是在VC6下會提示錯誤:cannot convert from 'char (*)[10]' to 'char ** '

查MSDN ,如此寫到:

When new is used to allocate a multidimensional array of objects, it yields a pointer to the first element of the array

意思是當new用來分配一個多維數組,得到的是指向這個數組第一個元素的指針。

這就是說得到的是一個一維指針。到這裏,我們可以寫出正確的代碼了:

char  (*a)[10];

a=new a[10][10];

但如何真正動態的創建的一個多維數組呢,比如一個n*m的數組?

//錯誤代碼

int n=10;

char (*a)[n];

a=new char[n][m];

上面代碼在VC6中錯誤:

F:/vc++/temp/temp.cpp(10) : error C2057: expected constant expression
F:/vc++/temp/temp.cpp(10) : error C2466: cannot allocate an array of constant size 0
F:/vc++/temp/temp.cpp(12) : error C2540: non-constant expression as array bound
F:/vc++/temp/temp.cpp(12) : error C2440: '=' : cannot convert from 'char (*)[1]' to 'char (*)[]'

正確的做法是先聲明一個n維數組,每個單元是指向char的指針,再分別對每個單元分配內存.代碼如下

 char **array=new char*[n];
 for(int i=0;i<n;i++)
  array[i]=new char[m];

注意:上面代碼在釋放分配的內存時要特別注意。因爲這是“深度內存分配”,所以釋放時,要對每個單元裏的指針指向的內存予以釋放。釋放內存代碼如下:

 for(i=0;i<n;i++)
      delete[] array[i];
 delete[] array;



轉自http://blog.csdn.net/gabby1985/article/details/724911

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章