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

C语言数组异常行为排查:元素缺失与段错误问题

解决C语言屏幕填充程序的字符缺失与段错误问题

问题概述

我编写的C语言程序用于将用户指定区域的屏幕填充为'X',并将内容存入数组后输出,但运行时出现两个问题:

  • 输入尺寸5,10时,数组drawPic[8][0]位置的'X'缺失
  • 随机触发segmentation fault:11错误(例如输入5,12时报错,输入10,12时正常)

错误代码示例

#include <stdio.h>

#define MAX_ROWS 8
#define MAX_COLS 10

int main() {
    int rows, cols;
    char drawPic[MAX_COLS][MAX_ROWS]; // 下标顺序错误:列在前,行在后

    printf("输入行数和列数:");
    scanf("%d,%d", &rows, &cols);

    // 填充数组
    for (int i = 0; i < cols; i++) { // 错误地遍历列作为外层循环
        for (int j = 0; j < rows; j++) {
            drawPic[i][j] = 'X';
        }
    }

    // 输出数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%c", drawPic[j][i]); // 下标顺序不匹配
        }
        printf("\n");
    }

    return 0;
}

问题原因分析

  1. 数组下标顺序错误:错误地将数组定义为[MAX_COLS][MAX_ROWS],填充和输出时的下标顺序混乱,导致特定位置的字符无法正确赋值或读取,出现drawPic[8][0]的'X'缺失问题。
  2. 数组越界访问:当用户输入的列数cols超过MAX_COLS(比如输入5,12时,cols=12大于定义的MAX_COLS=10),程序会访问数组未分配的内存区域,触发segmentation fault:11错误;而输入10,12时,rows=10超过MAX_ROWS=8但刚好未触发内存保护,属于未定义行为。

修正方案

修正点1:调整数组下标顺序

将数组定义为[MAX_ROWS][MAX_COLS],确保行、列的逻辑与实际使用一致,填充和输出时的下标对应正确。

修正点2:确保数组大小足够或动态分配内存

如果需要支持更大的尺寸,建议使用动态内存分配(malloc/free),避免固定大小数组的限制。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows, cols;

    printf("输入行数和列数:");
    scanf("%d,%d", &rows, &cols);

    // 动态分配二维数组
    char **drawPic = (char **)malloc(rows * sizeof(char *));
    for (int i = 0; i < rows; i++) {
        drawPic[i] = (char *)malloc(cols * sizeof(char));
    }

    // 填充数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            drawPic[i][j] = 'X';
        }
    }

    // 输出数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%c", drawPic[i][j]);
        }
        printf("\n");
    }

    // 释放动态分配的内存
    for (int i = 0; i < rows; i++) {
        free(drawPic[i]);
    }
    free(drawPic);

    return 0;
}

说明

  • 动态内存分配可以灵活适配用户输入的任意合法尺寸,彻底避免数组越界问题。
  • 修正下标顺序后,数组的行和列逻辑与填充、输出循环完全匹配,解决了特定位置字符缺失的问题。

内容的提问来源于stack exchange,提问作者pip-le-pip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:18:13