我們知道
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;
轉載自:https://blog.csdn.net/gabby1985/article/details/724911