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

C 語言二維陣列邊界元素求和:#define N 3, M 4 反了、行優先儲存導致邏輯錯誤

     編輯:C 語言問答

錯誤代碼片段


#define N 3
#define M 4
static int a[N][M] = {
    {1,2,3},
    {4,15,6},
    {12,18,9},
    {10,11,2}
}; // 初始化列表有 4 列 3 行,但 N=3, M=4 宣告為 3 行 4 列 → 不匹配

核心問題:C 語言二維陣列**行優先**,第一維 = 行數,第二維 = 列數

  • 資料明顯是 **4 行 3 列**(4 組大括號,每組 3 個數)。
  • #define N 3, M 4 宣告 a[3][4] → **3 行 4 列**,與資料維度**反了**。
  • 編譯器會截斷/補零導致資料錯位,後續迴圈邊界 i < N、j < M 遍歷錯誤區域。

修正版


#include 

#define ROWS 4   // 行數
#define COLS 3   // 列數

int main(void) {
    static int a[ROWS][COLS] = {
        {1, 2, 3},
        {4, 15, 6},
        {12, 18, 9},
        {10, 11, 2}
    };

    int sum = 0;
    // 邊界元素:第一行、最後一行、第一列(中間)、最後一列(中間)
    for (int j = 0; j < COLS; j++) {
        sum += a[0][j];           // 第一行
        sum += a[ROWS-1][j];      // 最後一行
    }
    for (int i = 1; i < ROWS-1; i++) {
        sum += a[i][0];           // 第一列 (排除角落已加)
        sum += a[i][COLS-1];      // 最後一列
    }

    printf("邊界元素和 = %d\n", sum); // 預期 60
    return 0;
}

通用邊界求和函數


int border_sum(int rows, int cols, int a[rows][cols]) {
    if (rows <= 0 || cols <= 0) return 0;
    if (rows == 1) { // 單行
        int s = 0;
        for (int j = 0; j < cols; j++) s += a[0][j];
        return s;
    }
    if (cols == 1) { // 單列
        int s = 0;
        for (int i = 0; i < rows; i++) s += a[i][0];
        return s;
    }
    int sum = 0;
    for (int j = 0; j < cols; j++) { sum += a[0][j]; sum += a[rows-1][j]; }
    for (int i = 1; i < rows-1; i++) { sum += a[i][0]; sum += a[i][cols-1]; }
    return sum;
}

關鍵觀念釐清

宣告含義記憶體佈局
int a[4][3]4 行、3 列連續 12 個 int:row0(col0,1,2), row1(...), row2(...), row3(...)
int a[3][4]3 行、4 列連續 12 個 int:row0(col0..3), row1(...), row2(...)
初始化列表外層大括號 = 行,內層 = 列{{r0c0,r0c1},{r1c0,r1c1}} → 2 行 2 列

避坑口訣

**「外層大括號數 = 行數 = 第一維」,「內層元素數 = 列數 = 第二維」**。寫 #define ROWS ... COLS ... 替代 N,M,語意自明、不易反。

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