三級指針四級存儲空間的開闢~

三級指針四級存儲空間

2015-05-15  青島  張俊浩

今天在技術問答板塊看到的帖子,花時間調出來,也順便整理作爲筆記~

原帖是:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*** Create3DActiveArray(int x, int y, int z)
{
    char ***pArr;
    int i, j,k;
    pArr = (char ***)malloc(x * sizeof(char **));

    for (i = 0; i < x; i++)
    {
        pArr[i] = (char **)malloc(y * sizeof(char *));
        for (j = 2; j < y; j++)
        {
           pArr[i][j] = (char *)malloc(z * sizeof(char));
           for (k = 0; k < z; k++)
           {
              pArr[i][j][k] = 0;
           }
        }
    }
    return pArr;
}
void Free3DActiveArray(char ***pArr, int x, int y)
{
    int i, j, k;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            free(pArr[i][j]);
            pArr[i][j] = NULL;
        }
        free(pArr[i]);
        pArr[i] = NULL;
    }
    free(pArr);
}
int main(){
    char ***table=Create3DActiveArray(2,2,100);
    strcpy(table[0][0],"num");
    printf("%s",table[0][0]);
    return 0;
}
//求解答呀,會出現段錯誤

額,感覺這類程序非常有意思,能強化內存意識~這裏是三級指針,意味着內存四級存儲空間,級與級之間不一定是連續的,級內是連續的(從虛擬地址來說)~所以你無法用pArrp[i][j][k]訪問方式~

附上內存分佈圖和修改的部分代碼~


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Create3DActiveArray(char**** pArr,int x, int y, int z)
{
//    char ***pArr;
	char ***pArr3Temp;//二級指針數組指針遊標
	char ** pArr2Temp;//一級指針數組指針遊標
	char *  pArr1Temp;//字符數組指針遊標
<span style="white-space:pre">	</span>int i, j,k;
<span style="white-space:pre">	</span>*pArr = (char ***)malloc(x * sizeof(char **));
	pArr3Temp =*pArr;

    for (i = 0; i < x; i++)
    {
	//	pArr1Temp = *pArr2Temp;
        *pArr3Temp = (char **)malloc(y * sizeof(char *));
		pArr2Temp = *pArr3Temp;

        for (j = 0; j < y; j++)//之前寫j=2?why?
        {

           *pArr2Temp = (char *)malloc(z * sizeof(char));
		   pArr1Temp = *pArr2Temp;
           for (k = 0; k < z; k++)
           {
              *pArr1Temp = 0;
			  ++pArr1Temp;//遍歷字符指針數組
           }
		   ++pArr2Temp;//遍歷一級指針數組
        }
		++pArr3Temp;//遍歷二級指針數組
    }
 //   return pArr;
}

int main(){
    char ***table;
    Create3DActiveArray(&table,2,2,4);
    strcpy((*(*table)),"num");
    printf("%s\n",*(*table));
    return 0;
}
發佈了54 篇原創文章 · 獲贊 56 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章