You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三维char数组赋值后部分内存无法访问的问题求助

三维字符数组内存分配错误引发的内存访问异常

核心问题:内存分配不足导致越界写覆盖

你的内存分配代码存在两处关键错误,直接导致堆内存被非法覆盖,引发看似无关的内存访问异常:

  • 第一层数组分配过小:char*** array = malloc(sizeof(char **)); 只申请了能存1个char**指针的空间,但后续循环要处理numberColumns列,当numberColumns > 1时,array[i](i≥1)会越界访问堆内存,破坏内存结构。
  • 第二层数组分配过小:array[i] = malloc(sizeof(char*)); 同样只申请了1个char*指针的空间,循环处理numberRows行时,array[i][j](j≥1)也会越界,后续的写入操作会覆盖其他内存区域,这就是为什么修改array[0][0][2]会影响array[0][4][0]的访问。

修正后的内存分配代码

需要根据实际的行列数分配足够的指针空间:

// 第一层:分配numberColumns个二级指针的空间
char*** array = malloc(numberColumns * sizeof(char **)); 
for(int i = 0; i < numberColumns; i++) {
    // 第二层:分配numberRows个一级指针的空间
    array[i] = malloc(numberRows * sizeof(char*));  
    for(int j = 0; j < numberRows; j++) {
        // 第三层:分配单个字符串的存储空间
        array[i][j] = malloc(maxStrLen * sizeof(char));
        // 可选:初始化内存为0,避免脏数据干扰
        memset(array[i][j], 0, maxStrLen * sizeof(char));
    }
}

额外优化建议

  1. 字符串终止符问题:你的copystr函数没有添加字符串终止符'\0',后续使用strlen、printf等字符串函数会触发未定义行为,建议补充:
    void copystr(char* pointer, char*** array, int length, int i, int j) {
        for (int k = 0; k < length; ++k) {
            array[i][j][k] = pointer[k+1];
        }
        // 确保字符串以'\0'结尾,注意length不能超过maxStrLen-1
        if (length < maxStrLen) {
            array[i][j][length] = '\0';
        }
    }
    
  2. 内存泄漏防护:使用完毕后要逐层释放内存:
    for(int i = 0; i < numberColumns; i++) {
        for(int j = 0; j < numberRows; j++) {
            free(array[i][j]);
        }
        free(array[i]);
    }
    free(array);
    

内容的提问来源于stack exchange,提问作者Jeremy Khoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:44:57