三维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)); } }
额外优化建议
- 字符串终止符问题:你的
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'; } } - 内存泄漏防护:使用完毕后要逐层释放内存:
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
相关产品推荐
相关产品推荐

