使用指针填充二维数组的修改程序失效问题求助
循环死循环问题分析与修复
问题根源
你修改后的代码会无限输出"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", ¤t_row[j] ); } } }
内容的提问来源于stack exchange,提问作者hogar
相关产品推荐
相关产品推荐

