将字符串常量附给三重数组的一个指针,出现段错误
 #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;
}

求解答呀,会出现段错误

3个回答

额,这类程序非常有意思,能强化存意识~
我觉得至少存在两点问题:
(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)函数吧~

yunfenglw
天朗-星空 这类程序非常有意思,能强化内存意识~
5 年多之前 回复
yunfenglw
天朗-星空 这类程序非常有意思,能强化存意识~
5 年多之前 回复

你所分配的,不满足数组要求的连续性的基本条件,所以不能用数组下标的方式访问。

额,附一下内存分布图~图片说明

立即提问