C 動態建立和刪除二維陣列

2021-06-25 20:45:43 字數 1240 閱讀 9187

1.

a (*ga)[n] = new a[m][n];

...delete ga;

缺點:n必須是已知

優點:呼叫直觀,連續儲存,程式簡潔(經過測試,析構函式能正確呼叫)

2.  a** ga = new a*[m];

for(int i = 0; i < m; i++)

ga[i] = new a[n];

...for(int i = 0; i < m; i++)

delete ga[i];

delete ga;

缺點:非連續儲存,程式煩瑣,ga為a**型別

優點:呼叫直觀,n可以不是已知

3.  a* ga = new a[m*n];

...delete ga;

缺點:呼叫不夠直觀

優點:連續儲存,n可以不是已知

4.  vector> ga;

ga.resize(m);                       //這三行可用可不用

for(int i = 1; i < n; i++)          //

ga[i].resize(n);                //

...缺點:非連續儲存,除錯不夠方便,編譯速度下降,程式膨脹(實際速度差別不大)

優點:呼叫直觀,自動析構與釋放記憶體,可以呼叫stl相關函式,動態增長

5.  vectorga;

ga.resize(m*n);

方法3,4的結合

6. 2的改進版(penrose提供,在此感謝)

a** ga = new a*[m];

ga[0] = new a[m*n];

for(int i = 1; i < m; i++)

ga[i] = ga[i-1]+n;

...delete  ga[0];

delete  ga;

缺點:程式煩瑣,ga為a**型別

優點:連續儲存,呼叫直觀,n可以不是已知

附:1,2,3,6還有對應的malloc-free版本

個人推薦1和4,2可以用4來代替,3,5呼叫太煩瑣,畢竟源程式是拿來看的

不是拿來執行的

下面是一些錯誤和沒成功的版本

1. a* ga = new a[m][n];

必然錯誤

2. vectorga;

ga.resize(m);

gcc 3.2下編譯失敗,不知道其它編譯器效果如何

也不知道標準是否允許

動態建立和釋放二維陣列

c動態建立和釋放二維陣列 include include define row 5 define col 4 main int i int arr arr int malloc row sizeof int for i 0 i使用calloc申請記憶體時,記憶體會清0,而malloc並不進行這項工作...

動態建立和釋放二維陣列

define crt secure no warnings include include include 動態建立二維陣列,指標做輸出 int get2darr char arr out int row,int col for int i 0 i row i arr p 掛上 return 0 完...

C 動態建立二維陣列

方法1 用一維陣列代替二維陣列 int n,m cin n m int a new int n m for int i 0 icoutcout執行結果 0 00491bb0 1 00491bb4 2 00491bb8 1 00491bbc 2 00491bc0 3 00491bc4 2 00491b...