錯誤代碼片段
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 參數 | 示例 |
| 基本類型 | &var | scanf("%d", &x) |
| 陣列元素 | &arr[i][j] | scanf("%d", &a[i][j]) |
| 結構體成員 | &st.member | scanf("%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」。