錯誤代碼核心片段
int a[3][3], b[3], c[3], d[3], i, j, *m;
// ...
for (j = 0; j <= 2; j++, m++) scanf("%d", m); // m 未初始化!
錯誤根因
int *m; 僅宣告指標變數,**未賦予任何合法地址**,其值為隨機垃圾值 (棧上殘留)。
scanf("%d", m) 嘗試向隨機地址寫入 → **段錯誤 / 記憶體不可讀/寫**。
正確指標使用三原則
- 指向現有物件:
m = &a[0][0]; 或 m = a[0]; (陣列退化為首元素指標)。
- 動態分配:
m = malloc(N * sizeof(int)); 使用後 free(m);。
- 字串字面量:
const char *s = "hello"; (唯讀)。
修正版:完全用陣列下標 (更簡單、安全)
#include <stdio.h>
int main() {
int a[3][3], b[3], c[3], d[3], i, j;
printf("請輸入 3x3 矩陣:\n");
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
// 轉置:b=第0列, c=第1列, d=第2列
for (i = 0; i < 3; i++) {
b[i] = a[i][0];
c[i] = a[i][1];
d[i] = a[i][2];
}
// 寫回 a (轉置後)
for (i = 0; i < 3; i++) {
a[0][i] = b[i];
a[1][i] = c[i];
a[2][i] = d[i];
}
printf("轉置後:\n");
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) printf("%d ", a[i][j]);
putchar('\n');
}
return 0;
}
指標版修正 (教學演示)
int *m = &a[0][0]; // 指向首元素
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
scanf("%d", m + i*3 + j); // 計算偏移
}
}
// 其餘邏輯同理用指標算術
避坑口訣
- **宣告即初始化**:
int *p = NULL; 或 int *p = &var;。
- **用前檢查**:
if (p) { *p = ...; }。
- **釋放後置 NULL**:
free(p); p = NULL;。
- **優先用陣列/容器**:現代 C/C++ 能用
std::vector/std::array 絕不手寫指標算術。