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

局部变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:04:54