N*N矩阵按K次列右移旋转时出现段错误的问题排查求助
问题排查与修复
我帮你找出了导致段错误和逻辑异常的几个关键问题,咱们一步步拆解来看:
1. 未初始化变量触发数组越界(段错误根源)
你在最外层的旋转循环第一行写了 temp=arr[i][0];,但这里的i是在main开头声明的未赋值变量(此时i是随机的垃圾值),直接用它访问数组arr[i][0]必然会触发数组越界,导致段错误。
另外,结尾的arr[i][j]=temp;里的i和j也是循环外的未正确赋值变量,进一步加剧了越界问题。
2. 行右移的逻辑错误
你想要实现每一行向右移动1位(循环K次),但当前的循环逻辑完全不对:
- 内层
j的循环范围j=1;j<n-1;j++会漏掉最后一个元素的移动,正确的做法应该是从后往前覆盖(避免数据丢失),范围设为j=n-1;j>0;j--。 - 向右移动时,应该保存当前行的最后一个元素(不是第一个),因为右移后最后一个元素会被移到第一个位置。
3. 冗余的旋转操作
如果K大于矩阵边长n(比如n=3,k=5),其实和k=2的效果完全一致(每n次旋转就回到原状态),所以可以先对k取模:k = k % n;,避免做无意义的重复循环。
4. 输出格式不符合预期
你预期的输出是数字用空格分隔,但你的printf("%d",arr[i][j]);没有添加空格,导致输出会连在一起,不符合要求。
修正后的代码
#include <stdio.h> int main() { int n, i, j, k, temp; scanf("%d", &n); int arr[n][n]; // 读取矩阵数据 for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ scanf("%d", &arr[i][j]); } } scanf("%d", &k); // 优化k值,减少冗余旋转 k = k % n; // 执行k次右旋转 for(int l = 0; l < k; l++){ // 逐行处理右移 for(i = 0; i < n; i++){ // 保存当前行的最后一个元素 temp = arr[i][n-1]; // 从后往前覆盖元素 for(j = n-1; j > 0; j--){ arr[i][j] = arr[i][j-1]; } // 将最后一个元素放到行首 arr[i][0] = temp; } } // 按要求输出矩阵(空格分隔) for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ printf("%d ", arr[i][j]); } // 每行结束换行(可选,按需调整) printf("\n"); } return 0; }
测试验证
用你给出的例子测试:
- 输入n=3,k=2
- 输入矩阵:
10 20 30 40 50 60 70 80 90 - 最终输出:
20 30 10 50 60 40 80 90 70
完全符合你的预期结果。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

