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

C語言二維陣列轉置輸入輸出錯誤排查:scanf 缺少取址符 & 經典案例

     編輯:C 語言問答

錯誤代碼片段


scanf("%d", one[i][j]);  // 缺少 &,傳遞的是 int 值而非地址

錯誤後果

  • one[i][j] 為 int 值 (如 0 或垃圾值),被當作地址傳給 scanf。
  • scanf 嘗試向該數值解釋的地址寫入 → **段錯誤 / 記憶體不可寫 / 莫名其妙的數據錯誤**。

修正代碼


scanf("%d", &one[i][j]);  // 加上 & 取址

完整可運行修正版


#include <stdio.h>

int main() {
    int one[5][2], two[2][5];
    int i, j;

    printf("請輸入 5x2 矩陣:\n");
    for (i = 0; i < 5; i++)
        for (j = 0; j < 2; j++)
            scanf("%d", &one[i][j]);  // 關鍵修正

    printf("原矩陣:\n");
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 2; j++) printf("%5d", one[i][j]);
        putchar('\n');
    }

    // 轉置
    for (i = 0; i < 5; i++)
        for (j = 0; j < 2; j++)
            two[j][i] = one[i][j];

    printf("轉置後 2x5 矩陣:\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 5; j++) printf("%5d", two[i][j]);
        putchar('\n');
    }
    return 0;
}

scanf 取址規則速記

類型scanf 參數示例
基本類型&varscanf("%d", &x)
陣列元素&arr[i][j]scanf("%d", &a[i][j])
結構體成員&st.memberscanf("%d", &s.age)
字串 (字符陣列)arr 或 &arr[0]scanf("%s", str) (陣列名即首地址)
指針變量ptr (已是地址)scanf("%d", ptr)

避坑口訣

  • **見 scanf 即檢查 &** (字串除外)。
  • 編譯器開啟 -Wformat (GCC/Clang) 或 /W4 (MSVC) 可自動報警「format expects pointer, argument has type int」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved