局部变量i值与赋值不符致1x2矩阵程序段错误问题排查
1x2矩阵触发段错误的原因及修复
问题根源
- 当
matrixSize == 1(即1行矩阵)时,处理分支的while循环未递增变量k,导致死循环:if (matrixSize == 1) { while (k < *returnSize) { list[k] = matrix[j][i]; i++; // 此处漏掉了k++,循环条件永远成立 } return list; } - 死循环中
i持续自增,很快超出矩阵列范围(1x2矩阵的i合法取值仅为0、1),继续访问matrix[j][i]会触发数组越界,破坏栈上的其他局部变量(比如k的值被覆盖,让循环永远无法终止),最终i变成随机值(如你看到的912),访问非法内存触发段错误。 - 其他尺寸矩阵不会进入该分支,因此运行正常。
修复方法
在1行矩阵的处理循环中,每次迭代必须递增k,也可以改用更不易出错的for循环:
修正后的完整代码
#include <stdio.h> #include <stdlib.h> int *spiralOrder(int matrix[][2], int matrixSize, int matrixColSize, int *returnSize) { *returnSize = matrixSize * matrixColSize; int left = -1; int right = matrixColSize - 1; int top = 0; int bottom = matrixSize; int k = 0; int i = 0; int j = 0; int count = 0; int *list = (int *)calloc(*returnSize, sizeof(int)); if (matrixSize == 1) { // 修复:添加k++,终止循环 while (k < *returnSize) { list[k] = matrix[j][i]; i++; k++; } return list; } while (k < *returnSize) { printf(" ( (%d) %d %d %d %d %d %d) ", count++, j, i, left, right, top, bottom); if (i < right && j == top) { list[k] = matrix[j][i]; i++; } else if (i == right && j < bottom) { if (j == top) { left++; bottom--; } list[k] = matrix[j][i]; j++; } else if (j == bottom && i > left) { list[k] = matrix[j][i]; i--; } else if (i == left && j > top) { if (j == bottom) { top++; right--; } list[k] = matrix[j][i]; j--; } k++; } printf("\n"); for (int i = 0; i < *returnSize; i++) { printf("at %i [%d] \n", i, list[i]); } return list; } int main() { int list[1][2] = {{ 1, 2 }}; int size; spiralOrder(list, 1, 2, &size); }
更简洁的1行矩阵处理方式
也可以替换成for循环,彻底避免循环变量遗漏的问题:
if (matrixSize == 1) { for (int idx = 0; idx < matrixColSize; idx++) { list[idx] = matrix[0][idx]; } return list; }
内容的提问来源于stack exchange,提问作者Harshit Singh
相关产品推荐
相关产品推荐

