为什么局部变量的值与其赋值不同?

Why a local variable is having value different from its assigned value?

提问人:Harshit Singh 提问时间:8/11/2023 最后编辑:chqrlieHarshit Singh 更新时间:8/11/2023 访问量:56

问:

当矩阵的维度为 1x2 时,该变量已经具有值,因此程序会遇到分割错误。我真的不明白问题是什么以及为什么会发生这种情况,因为当矩阵的大小为 3x3、3x4、2x2 等时,程序运行良好。i912

#include <stdio.h>
#include <stdlib.h>

int *spiralOrder(int matrix[1][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) {
        while (k < *returnSize) {
            list[k] = matrix[j][i];
            i++;
        }
        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);
}
C 指针 分段-故障 malloc

评论

1赞 Eric Postpischil 8/11/2023
一旦进入,循环将永远持续,因为在循环中既没有也没有改变。此循环反复递增,使其超出界外。您可以通过基本调试发现此错误,包括监视使用调试器或 的值。while(k<*returnSize)k*returnSizeiiprintf
0赞 Harshit Singh 8/11/2023
啊,谢谢伙计!

答:

0赞 chqrlie 8/11/2023 #1

如果是以下情况,则进行特殊情况:matrixSize1

if (matrixSize == 1) {
    while (k < *returnSize) {
        list[k] = matrix[j][i];
        i++;
    }
    return list;
}

循环是一个无限循环,因为在循环体中没有改变。这会导致具有未定义行为的缓冲区溢出,最终导致分段错误。whilek

建议使用具有清晰一致的循环初始化、测试和循环索引增量的循环,以避免此类问题。for