原始程式碼嘗試將 3x4 矩陣轉置,但存在嚴重的索引越界與邏輯錯誤:
for(n=0;n<3;n++) {
for(m=0;m<4;m++) {
a[m][n]=a[n][m]; // 錯誤:當 m>2 時 a[m][n] 存取超出第一維度範圍
}
}
printf("%d",a[m][n]); // m,n 迴圈結束後值為 3,4,存取 a[3][4] 越界
編譯器將 int a[3][4] 配置為 12 個連續 int。存取 a[i][j] 實際計算位移為 i * 4 + j。因此「原地轉置」在非方陣(行數≠列數)時無法直接交換,必須建立新陣列。
#include <stdio.h>
#define ROW 3
#define COL 4
void transpose() {
int a[ROW][COL], b[COL][ROW];
int i, j;
printf("請輸入 %dx%d 矩陣:\n", ROW, COL);
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++)
scanf("%d", &a[i][j]);
// 轉置至 b
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++)
b[j][i] = a[i][j];
printf("轉置後 %dx%d 矩陣:\n", COL, ROW);
for(i=0;i<COL;i++) {
for(j=0;j<ROW;j++)
printf("%5d", b[i][j]);
printf("\n");
}
}
scanf("%d\n", ...) 中的 \n 會導致掃描器等待非空白字元,建議移除。for 內宣告。a[i][j] 與 a[j][i](i<j)。理解二維陣列在記憶體中的線性佈局,是避免索引錯誤的關鍵。非方陣轉置必須配置新陣列,並正確對應行列索引;輸出時需雙層迴圈逐列列印,而非單一 printf。