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

C 語言二維陣列轉置錯誤分析:記憶體佈局與索引邏輯

     編輯:程式設計綜合問答

程式碼問題重現

原始程式碼嘗試將 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 格式字串:scanf("%d\n", ...) 中的 \n 會導致掃描器等待非空白字元,建議移除。
  • 迴圈變數作用域:C89 需在區塊開頭宣告,C99 可在 for 內宣告。
  • 方陣原地轉置:僅當 ROW==COL 時可用暫存變數交換 a[i][j] 與 a[j][i](i<j)。

總結

理解二維陣列在記憶體中的線性佈局,是避免索引錯誤的關鍵。非方陣轉置必須配置新陣列,並正確對應行列索引;輸出時需雙層迴圈逐列列印,而非單一 printf。

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