1. 程式人生 > >new建立 一維陣列、二維陣列、三維陣列、四維陣列...

new建立 一維陣列、二維陣列、三維陣列、四維陣列...

用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;


就先到這裡吧