二维数组顺时针90度旋转:行列索引赋值编译错误求助
二维数组顺时针90度旋转的错误排查与修正方案
错误原因分析
- 二维数组函数参数声明不合法:C语言要求二维数组作为函数形参时,必须指定第二维的长度(如
char arr[][7]),不能使用char arr[][]的形式。编译器需要第二维长度来计算元素的内存偏移地址,否则会触发expression must be a pointer to a complete object type错误。 - 函数调用传参错误:
main函数中调用DisplayArray2D(arrRotated[7][7])是错误的,arrRotated[7][7]是数组的越界元素(数组索引范围为0~6),而函数需要接收二维数组的地址,应直接传递数组名arrRotated。 - 旋转逻辑错误:原代码的
arrRotated[count][i] = arr[i][count]只是对数组进行转置,无法实现顺时针90度旋转的效果。
修正方案与正确代码
核心修正点
- 修正函数参数的二维数组声明,明确第二维长度为7;
- 修正
DisplayArray2D的传参方式; - 调整循环逻辑,实现正确的顺时针90度映射:对于7×7数组,原位置
(i, j)的元素旋转后应位于(j, 6 - i),或者通过遍历原数组的列(从下到上)赋值到旋转数组的行(从左到右)。
完整正确代码
#include <stdio.h> void DisplayArray2D(char arr[][7]); void RotateArray2D(char arr[][7], char arrRotated[][7]); int main() { char arrRotated[7][7]; char arr[7][7] = { {'*',' ',' ',' ',' ',' ',' '}, {'*','*',' ',' ',' ',' ',' '}, {'*','*','*',' ',' ',' ',' '}, {'*','*','*','*','*','*','*'}, {'*','*','*',' ',' ',' ',' '}, {'*','*',' ',' ',' ',' ',' '}, {'*',' ',' ',' ',' ',' ',' '}, }; RotateArray2D(arr, arrRotated); DisplayArray2D(arrRotated); } void DisplayArray2D(char arr[][7]) { int i, count; for (i = 0; i < 7; i++) { for (count = 0; count < 7; count++) printf("%c", arr[i][count]); printf("\n"); } } void RotateArray2D(char arr[][7], char arrRotated[][7]) { // 顺时针90度旋转:原数组列j从下到上,转为旋转数组行j从左到右 for (int j = 0; j < 7; j++) { for (int i = 0; i < 7; i++) { arrRotated[j][6 - i] = arr[i][j]; } } }
代码说明
RotateArray2D函数中,外层循环遍历原数组的列索引j,内层循环遍历行索引i,将原数组arr[i][j]赋值到旋转数组的arrRotated[j][6 - i]位置,实现顺时针90度旋转;- 调用
RotateArray2D时,参数顺序调整为arr(原数组)在前,arrRotated(目标数组)在后,符合逻辑习惯。
内容的提问来源于stack exchange,提问作者ODK1992
相关产品推荐
相关产品推荐

