動態分配記憶體建立三維陣列
阿新 • • 發佈:2019-01-01
/************************************************************************/ /* 假定三維陣列是: 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)); } } }