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

使用指针填充二维数组的修改程序失效问题求助

循环死循环问题分析与修复

问题根源

你修改后的代码会无限输出"Give an integer",本质是循环终止条件完全错误:

  • 外层循环的p < p + n:每次循环p执行++p后,p + n的结果也会跟着加1——相当于你每次往前跑一步,终点也同步往前挪一步,永远到不了头,循环永远不会结束。
  • 内层循环的q < q + m也是同样的逻辑,q每递增一次,q+m也变大一次,q永远小于q+m,内层循环直接无限执行。

初始程序的正确逻辑

原来的代码之所以能正常终止,是因为提前把终止地址算好并存在了固定变量里:

  • p_end = p + n是在循环开始前就确定的固定值,就是二维数组第n行之后的地址,不会随着p的递增改变;
  • q_end = q + m同理,是当前行第m列之后的固定地址。
    这样每次判断p < p_end,当p遍历完n行后,就会触发退出条件,内层循环也一样能正常结束。

修复方案

把终止地址提前计算并保存,复用初始程序的正确逻辑即可,修复后的代码如下:

void assign_V2( int **mat, int n, int m) {   
    int **p = mat;  
    int **p_end = p + n; // 提前计算固定的终止地址
    for ( ; p < p_end; ++p )   
    {
        int *q = *p;  
        int *q_end = q + m; // 提前计算固定的终止地址
        for ( ; q < q_end; ++q ) 
        {         
            printf( "Give an integer: " );         
            scanf( "%d", q );         
        }  
    }   
}

如果觉得指针遍历的写法不够直观,也可以改用计数器式的循环,可读性更强:

void assign_V2( int **mat, int n, int m) {   
    for (int i = 0; i < n; ++i)   
    {
        int *current_row = mat[i];  
        for (int j = 0; j < m; ++j) 
        {         
            printf( "Give an integer: " );         
            scanf( "%d", &current_row[j] );         
        }  
    }   
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:12:46