首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言打印空心矩形:變長數組陷阱與動態分配修正

     編輯:程式設計綜合問答

問題代碼分析

int main() {
    int i, j, m, n;
    char a[m][n]; // 錯誤:使用未初始化的變量作為數組維度
    printf("請輸入行和列:\n");
    scanf("%d,%d", &i, &j);
    // ... 後續邏輯使用 m, n 作為循環邊界,但 m, n 此時仍未賦值
}

核心錯誤

  1. 變長數組(VLA)聲明時機錯誤:C99 支持 VLA,但必須在 讀取維度值之後 聲明數組。代碼在 scanf 之前就聲明了 a[m][n],此時 m, n 為垃圾值。
  2. 邏輯變量混淆:輸入存入 i, j,但數組聲明用 m, n,循環又用 m, n 作為邊界,導致行列邏輯錯位。
  3. 棧溢出風險:大尺寸 VLA 會耗盡棧空間,建議改用堆內存。

修正版本(動態分配)

#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 表示行列,邏輯清晰。
  • 增加輸入校驗與內存分配失敗處理。

這樣修改後,程序能穩定運行並正確打印任意尺寸的空心矩形。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved