在线编译器 C

#include <stdio.h> int main() { int a[12]; for (int i = 0; i < 4; i++) { scanf("%d", &a[i]); } for (int i = 4; i >= 0; i--) { printf("%d ", a[i]); } for (int i = 4; i < 8; i++) { scanf("%d", &a[i]); } for (int i = 8; i > 4; i--) { printf("%d ", a[i]); } for (int i = 8; i < 12; i++) { scanf("%d", &a[i]); } for (int i = 12; i > 8; i--) { printf("%d ", a[i]); } return 0; }
这段代码试图分三组读取12个整数,然后每组逆序输出。但代码中存在数组越界访问的问题。

- 第一个输出循环 `for (int i = 4; i >= 0; i--)` 会访问 `a[4]`,但此时 `a[4]` 还没有被输入赋值,因为第一个输入循环只读了 `a[0]` 到 `a[3]`。而且这个循环会输出5个数,但第一组只读了4个数。
- 第二个输出循环 `for (int i = 8; i > 4; i--)` 会访问 `a[8]`,但第二组输入只读了 `a[4]` 到 `a[7]`,所以 `a[8]` 未赋值。同时循环条件 `i > 4` 会输出 `a[8]` 到 `a[5]` 共4个数,但第二组只读了4个数,这里多了一个未赋值的 `a[8]`。
- 第三个输出循环 `for (int i = 12; i > 8; i--)` 会访问 `a[12]`,但数组最大下标是11,这是越界访问。同时循环输出5个数,但第三组只读了4个数。

提示:
- 检查每个输出循环的起始值和结束条件,确保只输出已输入的元素,并且不超出数组边界。
- 注意数组下标从0开始,最后一个有效下标是11。