new建立 一維陣列、二維陣列、三維陣列、四維陣列...
阿新 • • 發佈:2018-12-29
用new建立多維陣列時,最後需要用delete,但是我在delete時遇到了麻煩,實在不能再浪費時間了,先mark一下,至少建立多維陣列這段是對的
以int型陣列為例,我們知道
一維陣列 int a[4] ={1,2,3,4};
二維陣列 int b[3][4] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4}
三維陣列 int c[2][3][4] = {1,2};
那麼用new方式如何建立呢
一維陣列有
int *p1 = new int[4];
二維陣列有
int (*p2)[4] = new int[3][4];
三維陣列
int (*p3)[3][4] = new int[2][3][4];//兩維三行四列
同樣的四位陣列
int (*p4)[2][3][4] = new int[1][2][3][4];//不知道怎麼叫了
忘了從哪裡看到的說: 從二維陣列開始,定義並不是寫成 int *p2[4]、int * p3[3][4]、...這是因為int * p2[4]表示定義一個數組p2,該陣列是int *型,陣列內的每個元素都是指向int型的指標。
//step 1定義多維陣列 //int *q1 = new int[4]; //建立一維陣列,暫時不用 //int (*q2)[4] = new int[0][4];//建立二位陣列,暫時不用 int (*p)[3][4] = new int[2][3][4];//建立三維陣列,本文研究的重點,我為了少打字,這個變數我定義成了p,並不是p3 //int (*p4)[3][4][5] = new int [0][3][4][5];//建立四維陣列 //留個標記,用於 //存放這些陣列的指標,用於驗證是否delete時會用到 int *backup[24]; int imark = 0; //迴圈將三維陣列每個元素均賦值為1 printf("------初始化得到的二維陣列----\n"); for(int i = 0;i< 2;i++) { for(int j = 0;j<3;j++) { for(int k = 0;k<4;k++) { printf("%d --->",(*(*(p+i)+j)+k));//初始化之前均為0 printf("%d ",*(*(*(p+i)+j)+k));//這裡列印了new出來的三維陣列,本層迴圈最後將每個值賦值成了1 backup[imark++] = (*(*(p+i)+j)+k); *(*(*(p+i)+j)+k) = 1;//這裡將每個元素賦值成了1,為的是方便後面delete時對比檢視 } printf("\n"); } } printf("---------------------\n");// //step 2 準備檢驗 //前輩說書中講的,陣列的大小在之前的四個位元組記憶體儲著,究竟是啥呢,在這裡可以列印檢視printf("front 4 byte is %d, -->%d\n",&p[0][0][0]-1,(int)*(&p[0][0][0]-1));printf("p[0][0][0] address is %d\n",&p[0][0][0]);printf("p[1][2][3] address is %d\n",&p[1][2][3]);printf("\n");//這裡嘗試了好多種delete的方式都沒有成功???╮(╯▽╰)╭ //第一種嘗試,直接刪除p陣列,這個似乎從原理上很容易否定 /* delete []p;//這種方式發現只刪除了new出來的前兩個元素 */ //第二種嘗試,借用一下儲存的指標,用指標一個一個去free /* for(int i =0;i<24;i++) { delete backup[i];//用backup中記憶的位置一個一個刪除,發現行不通,&backup[i]也行不通 //delete []backup;//這種也是行不通的,我註解上了,可以試試 } */ //第三種嘗試,巢狀進入生成的陣列,一層一層的去free,然而依然失敗,不知道是重複刪除了,還是怎麼了,感覺是重複刪除了 for(int i = 0;i<2;i++) { for(int j = 0;j<3;j++) { delete [] p[i][j]; } delete []p[i]; } //第四種嘗試,一個一個刪,但依然沒有成功,我從大到小,先小到大均試了一次,依然失敗,下面寫的是從大到小 /* delete p[1][2][3];//不要搞混亂,2*3*4維陣列最大值就是這個 delete p[1][2][3];//不列寫了,因為佔篇幅,可以肯定的是沒成功 //... delete p[0][0][0]; */ //這裡面檢查是否已經delete了 for (int i = 0; i < 24; i++) { if ((i != 0) && (i % 4 == 0)) { printf("\n"); } printf("[%d]%d--->%d ", i, backup[i], (int) *backup[i]); } printf("\n"); return 0;
我目前gdb方式還不會看,另外delete還學得不夠深入,再鑽進去週末別的也就看不成了,所以得先記下。
另外粘一個別人new三維陣列的方法
int*** a= new int**[5]; for (int i = 0; i < 5; ++i) { a[i] = new int*[6]; for (int j = 0; j < 6; ++j) { a[i][j] = new int[7]; } } for (int i = 0; i < 5; ++i) { for (int j = 0; j < 6; ++j) { delete[] a[i][j]; } delete[] a[i]; } delete[] a;
就先到這裡吧