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;

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM