2011-04-08 119 views
1

對於我的程序,我需要將二維數組指針傳遞給一個單獨文件中的函數。我已經寫了下面一個同樣-syntaxed文件:在C中傳遞二維數組指針

#include <stdlib.h> 
#include <stdio.h> 

typedef struct { 
    int state; 
    int design; 
} card_t; 

card_t *cardSet[5][5]; 

void setFirst(card_t *cards[][]) { // <- Error: Array has incomplete element type 
    cards[0][0]->state = 1; 
} 

int main() { 
    setFirst(cardSet); // <- Error: Type of formal parameter 1 is incomplete 
    return 0; 
} 

當我修改代碼,它編譯罰款所有一維數組,但對於一個二維數組我得到如上所示的錯誤。這兩種情況有什麼區別?

謝謝! Cameron

回答

1

如果將數組傳遞給某個函數,則必須指定內部數組的大小,而不是void setFirst(card_t *cards[][]),則應指定void setFirst(card_t *cards[][5])

爲什麼你需要指定它而不是第一維的大小?由於cards是card_t指針數組的陣列,所以如果你想獲取cards [1] [0],編譯器將需要知道多少要添加到指針cards - 卡被聲明爲:card_t *cards[5][4]它將需要添加4 * sizeof(*card_t)以獲得卡片[1] [0],但是如果宣佈卡片:card_t *cards[5][5],則需要添加5 * sizeof(*card_t)才能獲得卡片[1] [0]。

0

只有第一個索引是可選的。你應該明確地提到第二個索引,因爲二維數組衰減到指向1d數組的指針。

void setFirst(card_t *cards[][5]) { 
          //^Newly added 

// .. 

} 

還要確保指針指向有效的內存位置。否則,解除引用會導致分段錯誤。順便說一句,有什麼理由有指針的二維數組。我認爲你只是在複雜的程序。

0

爲了實現類似於您所嘗試的操作C99具有可變長度數組。這些函數定義來特別方便:

void setFirst(size_t n, size_t m, card_t *cards[n][m]) { 
... 
} 

注意,你必須有在數組聲明的時刻稱爲大小參數,所以你必須把它們放在前面。

1

如前所述,要傳遞一個2d數組到一個函數,您需要每個維度都有,但是第一個聲明。 但是,您也可以只傳遞指針,如下所示。請注意,您應該始終(除非數組維度完全固定,並且對數組操作的函數僅在數組維度中運行)也要通過每個數組的長度。

void setFirst(card_t ***cards, size_t n, size_t m) { 
    if (n > 0 && m > 0) { 
    cards[0][0]->state = 1; 
    } 
} 

由於經由code[0][0]引用的陣列是相同的*(*(code+0)+0*m),可以傳遞兩個指針,而不是陣列尺寸。