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

来源:互联网 发布:淘宝40磅反曲弓 编辑:程序博客网 时间:2024/05/01 03:24
/************************************************************************//* 假定三维数组是: 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));}}}



    

原创粉丝点击