C语言动态分配二维char数组并创建拷贝时出现段错误如何解决
问题排查与解决
核心错误点
你的代码触发段错误是由以下三个明显的逻辑错误共同导致的:
- 二维数组original的行分配边界错误:初始化original每行内存的循环条件写为
i < columns,正确应为i < lines。如果lines的数值大于columns,后续填充数据时访问original[i](i≥columns)就属于越界访问未分配的指针空间,直接触发内存访问异常。 - 拷贝数组copy的二级指针未分配内存:声明
char **copy = NULL后直接对copy[i]赋值,没有先为copy本身分配可存储lines个char*类型指针的内存空间。未分配内存就解引用空指针属于典型的野指针访问,是段错误的直接诱因。 - 字符串缺少终止符:你为每行分配了
columns +1的存储空间,但填充数据后没有手动在每行末尾补'\0',strcpy函数依赖字符串终止符判断拷贝边界,找不到终止符时会发生越界读内存,也可能触发异常。
修正后的实现代码
original数组分配与填充部分
#include <stdlib.h> #include <stdio.h> #include <string.h> char **original; // 分配一级指针数组,大小对应行数lines original = malloc(sizeof(char *) * lines); if (original == NULL) { // 可自行添加内存分配失败的处理逻辑 exit(EXIT_FAILURE); } int i, j; // 循环边界改为行数lines,为每一行分配列数+1的空间 for (i = 0; i < lines; i++) { original[i] = malloc(sizeof(char) * (columns + 1)); if (original[i] == NULL) { exit(EXIT_FAILURE); } } // 填充矩阵数据 for (i = 0; i < lines; i++) { for (j = 0; j < columns; j++) { scanf(" %c", &original[i][j]); } // 手动补充字符串终止符,保证后续字符串操作合法 original[i][columns] = '\0'; }
数组拷贝部分
// 先为copy分配一级指针数组的内存 char **copy = malloc(sizeof(char *) * lines); if (copy == NULL) { exit(EXIT_FAILURE); } for (i = 0; i < lines; i++) { copy[i] = malloc(sizeof(char) * (columns + 1)); if (copy[i] == NULL) { exit(EXIT_FAILURE); } strcpy(copy[i], original[i]); }
额外注意事项
使用完动态分配的二维数组后,需要按顺序释放内存避免泄漏:先逐行释放每个original[i]、copy[i],再释放original和copy本身的指针空间。
内容的提问来源于stack exchange,提问作者luis2608
相关产品推荐
相关产品推荐

