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;


就先到这里吧



  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值