wkw0018 2015-05-14 10:40 采纳率: 100%
浏览 1537
已采纳

将字符串常量附给三重数组的一个指针,出现段错误

 #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条回答 默认 最新

  • 天朗-星空 2015-05-15 12:32
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分