1. 程式人生 > >動態分配記憶體建立三維陣列

動態分配記憶體建立三維陣列

	/************************************************************************/
	/* 假定三維陣列是: 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));
			}
		}
	}