int main() {
int i, j, m, n;
char a[m][n]; // 錯誤:使用未初始化的變量作為數組維度
printf("請輸入行和列:\n");
scanf("%d,%d", &i, &j);
// ... 後續邏輯使用 m, n 作為循環邊界,但 m, n 此時仍未賦值
}
scanf 之前就聲明了 a[m][n],此時 m, n 為垃圾值。i, j,但數組聲明用 m, n,循環又用 m, n 作為邊界,導致行列邏輯錯位。#include <stdio.h>
#include <stdlib.h>
int main() {
int rows, cols;
printf("請輸入行和列(用逗號分隔):\n");
if (scanf("%d,%d", &rows, &cols) != 2 || rows <= 0 || cols <= 0) {
printf("輸入無效\n");
return 1;
}
// 堆上分配一維數組模擬二維
char *grid = malloc(rows * cols);
if (!grid) { printf("內存不足\n"); return 1; }
// 初始化為空格
for (int k = 0; k < rows * cols; k++) grid[k] = ' ';
// 繪製邊框
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (r == 0 || r == rows - 1 || c == 0 || c == cols - 1) {
grid[r * cols + c] = '*';
}
}
}
// 輸出
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
putchar(grid[r * cols + c]);
}
putchar('\n');
}
free(grid);
return 0;
}
malloc(rows * cols) 替代 VLA,避免棧溢出,適用於大尺寸。rows, cols 表示行列,邏輯清晰。這樣修改後,程序能穩定運行並正確打印任意尺寸的空心矩形。