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

为何C语言代码中变量j在第15次迭代时获取输入值并终止程序?

数组越界导致的变量内存覆盖问题解析

循环条件的逗号表达式陷阱

你第一个for循环里的i<3,j<3是逗号表达式,C语言中逗号表达式的结果只取最后一个子表达式的值,所以这个循环的终止条件实际上只有j<3——不管i变成多少,只要j小于3,循环就会继续跑。当i增加到3之后,循环还会执行,这时候访问matrix[3][j]就已经超出了3x3数组的合法索引范围(数组行索引只能是0、1、2)。

数组越界意外修改了变量j

C语言里局部变量存在栈内存中,matrix数组和变量j的内存位置是相邻的(具体布局由编译器决定,但大概率数组之后就是j的内存)。当你给越界的matrix[3][j]赋值时,实际上是在改写j所在的内存地址的值。所以调用get_int输入的数值,直接写到了j的内存里,导致j被替换成输入值,如果这个值不满足j<3,循环就会终止——这就是你看到j“获取输入值”的根本原因,本质是内存越界覆盖了变量。

正确的3x3矩阵输入输出实现

用嵌套循环逻辑更清晰,能彻底避免越界和逻辑混乱:

#include <stdio.h>
#include <cs50.h>

int main(void){
    int matrix[3][3];
    // 输入矩阵元素
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            matrix[i][j] = get_int("Please enter %i th and %i th element of matrix: ", i, j);
        }
    }
    // 输出矩阵
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            printf("%i\t", matrix[i][j]);
        }
        printf("\n");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:40:13