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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 22:24:03