当矩阵的维度为 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);
}
如果
matrixSize
是 1
,则为特例:
if (matrixSize == 1) {
while (k < *returnSize) {
list[k] = matrix[j][i];
i++;
}
return list;
}
while
循环是一个无限循环,因为k
在循环体中没有改变。这会导致缓冲区溢出和未定义的行为,最终导致分段错误。