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

问题描述 投票:0回答:1

当矩阵的维度为 1x2 时,变量

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

#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 pointers segmentation-fault malloc
1个回答
0
投票

如果

matrixSize
1
,则为特例:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.