动态分配内存创建三维数组

	/************************************************************************/
	/* 假定三维数组是: MyInfo arrayInfo[2][3][4];                           */
	/************************************************************************/
	typedef struct tagMyInfo
	{
		unsigned char ucInfo1;
		unsigned char ucInfo2;
	}MyInfo;

	int iMax = 2;
	int jMax = 3;
	int kMax = 4;
	int i = 0;
	int j = 0;
	int k = 0;		

	MyInfo ***pppMyInfo = (MyInfo ***)malloc(iMax*jMax*kMax*sizeof(MyInfo) + iMax*jMax*sizeof(MyInfo*));
	/*初始化*/
	for (i=0; i<iMax; i++)
	{
		pppMyInfo[i] = (MyInfo**)((char*)pppMyInfo + iMax*sizeof(MyInfo*) + i*jMax*kMax*sizeof(MyInfo));
		for (j=0; j<jMax; j++)
		{
			pppMyInfo[i][j] = (MyInfo*)((char*)(pppMyInfo[i]) + jMax*sizeof(MyInfo*) + j*kMax*sizeof(MyInfo));
			for (k=0; k<kMax; k++)
			{
				memset(pppMyInfo[i][j]+k, 0, sizeof(MyInfo));
			}
		}
	}

	/*像静态数组一样使用*/
	pppMyInfo[0][0][0].ucInfo1 = 0;
	pppMyInfo[0][0][0].ucInfo2 = 1;
	pppMyInfo[1][2][3].ucInfo1 = 23;
	pppMyInfo[1][2][3].ucInfo2 = 24;
	printf("\r\n %u, %u", pppMyInfo[0][0][0].ucInfo1, pppMyInfo[0][0][0].ucInfo2);
	printf("\r\n %u, %u", pppMyInfo[1][2][3].ucInfo1, pppMyInfo[1][2][3].ucInfo2);

	/************************************************************************/
	/* 二维数组也是同样,更简单一点;                                       */
	/************************************************************************/
	MyInfo **ppMyInfo = (MyInfo **)malloc(iMax*jMax*sizeof(MyInfo) + iMax*sizeof(MyInfo*));
	/*初始化*/
	for (i=0; i<iMax; i++)
	{
		ppMyInfo[i] = (MyInfo*)((char*)ppMyInfo + iMax*sizeof(MyInfo*) + i*jMax*sizeof(MyInfo));
		for (j=0; j<jMax; j++)
		{				
			memset(ppMyInfo[i]+j, 0, sizeof(MyInfo));				
		}
	}

	/*像静态数组一样使用*/
	ppMyInfo[0][0].ucInfo1 = 0;
	ppMyInfo[0][0].ucInfo2 = 1;
	ppMyInfo[1][2].ucInfo1 = 5;
	ppMyInfo[1][2].ucInfo2 = 6;
	printf("\r\n %u, %u", ppMyInfo[0][0].ucInfo1, ppMyInfo[0][0].ucInfo2);
	printf("\r\n %u, %u", ppMyInfo[1][2].ucInfo1, ppMyInfo[1][2].ucInfo2);


	free(pppMyInfo);
         free(ppMyInfo);

          今天用到了3级指针,其实工作中还是很少使用这种东西的,尤其是我现在的工作对于编程技巧要求不高,相对的行业专业性知识和业务能力更重要;

          记得当初找工作时还有公司笔试过类似的题,就顺便贴出来,希望对有需要的人能有所帮助,折腾明白这个,对指针就应该有一个较好的掌握了;

          当然,实现方式不唯一,比如可以针对每个一维数组分多次申请内存,也可以像下面这样做一下调整

	/************************************************************************/
	/* 还可以将用于存放中间指针地址的内存并在一起,这样数据元素能连续存放   */
	/************************************************************************/
	for (i=0; i<iMax; i++)
	{
		pppMyInfo[i] = (MyInfo**)((char*)pppMyInfo + iMax*jMax*sizeof(MyInfo*) + i*jMax*kMax*sizeof(MyInfo));
		for (j=0; j<jMax; j++)
		{
			pppMyInfo[i][j] = (MyInfo*)((char*)(pppMyInfo[i]) + j*kMax*sizeof(MyInfo));
			for (k=0; k<kMax; k++)
			{
				memset(pppMyInfo[i][j]+k, 0, sizeof(MyInfo));
			}
		}
	}



    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值