为何C语言实现的杨辉三角仅特定输入出现段错误?
杨辉三角程序数组越界问题修复及平台差异解释
你的代码核心问题是数组越界访问,属于C语言中的未定义行为,不同在线平台的栈空间配置不同,因此触发异常的阈值存在差异。
错误点分析
- 数组尺寸声明错误:你计划创建比输入行数大1的数组,但实际代码中
int intNum[intRows][intColumns];的intColumns = intRows,数组大小为intRows × intRows,后续填充循环需要访问intCount+1 = intRows+1的索引,远超数组最大合法索引(数组索引从0开始,最大为intRows-1)。 - 循环条件错误:
- 填充0的循环使用
intCount <= intRows+1,会遍历到intCount = intRows+1,超出数组行范围;列循环同理越界。 - 填充杨辉三角的循环使用
intCount <= intRows,当intCount = intRows时,intCount+1 = intRows+1,再次越界访问数组。
- 填充0的循环使用
修复方案
修复步骤
- 调整数组大小:声明数组为
int intNum[intRows + 1][intRows + 1];,让行和列索引范围覆盖0到intRows,满足填充和访问需求。 - 修正循环条件:
- 填充0的循环将
<= intRows+1改为< intRows + 1,确保只遍历合法索引。 - 填充杨辉三角的循环将
intCount <= intRows改为intCount < intRows,避免越界;列循环优化为intCount1 <= intCount,只处理当前行的有效元素,减少无效计算。
- 填充0的循环将
- 优化输出逻辑:输出时仅遍历有效行和列,让结果符合预期格式。
修复后的代码
#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
相关产品推荐
相关产品推荐

