#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;
}
求解答呀,会出现段错误
额,这类程序非常有意思,能强化存意识~
我觉得至少存在两点问题:
(1)如楼上所言,“不满足数组要求的连续性的基本条件”,或者说这里是三级指针,意味着内存四级存储空间,级与级之间是不一定连续的,级内是连续的(从虚拟地址来说)~所以你无法用数组 pArr[i][j][k]方式访问~
(2) char pArr;你定义在了函数char Create3DActiveArray(int x, int y, int z)内,是局部变量,存放在堆栈上,函数调用结束后内存会销毁~所以函数返回值无效。你可以传char **table地址过去(如我修改的代码),也可以char **table定义在main函数外作为全局变量。
#include
#include
#include
void Create3DActiveArray(char**** pArr,int x, int y, int z)
{
// char **pArr;
char **pArr3Temp;//二级指针数组指针游标
char ** pArr2Temp;//一级指针数组指针游标
char * pArr1Temp;//字符数组指针游标
int i, j,k;
*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;
}
我修改了你的void Create3DActiveArray(char**** pArr,int x, int y, int z)函数和main()函数,你按这个思路修改void Free3DActiveArray(char ***pArr, int x, int y)函数吧~
你所分配的,不满足数组要求的连续性的基本条件,所以不能用数组下标的方式访问。
额,附一下内存分布图~