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

为何C语言实现的杨辉三角仅特定输入出现段错误?

杨辉三角程序数组越界问题修复及平台差异解释

你的代码核心问题是数组越界访问,属于C语言中的未定义行为,不同在线平台的栈空间配置不同,因此触发异常的阈值存在差异。

错误点分析

  1. 数组尺寸声明错误:你计划创建比输入行数大1的数组,但实际代码中int intNum[intRows][intColumns];的intColumns = intRows,数组大小为intRows × intRows,后续填充循环需要访问intCount+1 = intRows+1的索引,远超数组最大合法索引(数组索引从0开始,最大为intRows-1)。
  2. 循环条件错误:
    • 填充0的循环使用intCount <= intRows+1,会遍历到intCount = intRows+1,超出数组行范围;列循环同理越界。
    • 填充杨辉三角的循环使用intCount <= intRows,当intCount = intRows时,intCount+1 = intRows+1,再次越界访问数组。

修复方案

修复步骤

  1. 调整数组大小:声明数组为int intNum[intRows + 1][intRows + 1];,让行和列索引范围覆盖0到intRows,满足填充和访问需求。
  2. 修正循环条件:
    • 填充0的循环将<= intRows+1改为< intRows + 1,确保只遍历合法索引。
    • 填充杨辉三角的循环将intCount <= intRows改为intCount < intRows,避免越界;列循环优化为intCount1 <= intCount,只处理当前行的有效元素,减少无效计算。
  3. 优化输出逻辑:输出时仅遍历有效行和列,让结果符合预期格式。

修复后的代码

#include <stdio.h>

int main(void){
    int intCount;
    int intCount1;
    int intRows;
    
    printf("HOW MANY ROWS DO YOU WANT?? ");
    scanf("%i", &intRows);
    
    // 声明足够大的二维数组,行和列数为输入行数+1
    int intNum[intRows + 1][intRows + 1];

    printf("PASS ");
    
    // 填充数组为0,遍历合法索引范围
    for(intCount = 0; intCount < intRows + 1; ++intCount){
        for(intCount1 = 0; intCount1 < intRows + 1; ++intCount1){
            intNum[intCount][intCount1] = 0;
        }
    }
    
    printf("PASS ");
    
    // 设置杨辉三角起始点
    intNum[0][0] = 1;
    
    // 填充杨辉三角,避免越界访问
    for(intCount = 0; intCount < intRows; ++intCount){
        // 仅处理当前行的有效列
        for(intCount1 = 0; intCount1 <= intCount; ++intCount1){
            intNum[intCount+1][intCount1+1] = intNum[intCount][intCount1+1] + intNum[intCount][intCount1];
        }
    }

    printf("PASS\n");
    
    // 输出杨辉三角的有效元素
    for(intCount = 0; intCount < intRows; ++intCount){
        for(intCount1 = 0; intCount1 <= intCount; ++intCount1){
            printf("%4i", intNum[intCount][intCount1]);
        }
        printf("\n");
    }
    return 0;
}

平台差异原因解释

C语言中局部数组分配在栈内存上,不同在线平台的栈空间配置不同:

  • repl.it的栈空间较小,数组越界后很快破坏栈帧结构,触发段错误(signal: segmentation fault)。
  • OnlineGDB的栈空间相对较大,越界后暂时未破坏关键栈数据,因此无报错但输出结果因内存被非法修改而异常。

这种越界访问属于未定义行为,C标准不保证其表现,必须严格避免。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:05