2013-03-17 70 views
1

我有一個2x3 char矩陣存儲在列的主要順序(是的,我知道這有點令人困惑,但請耐心等待),作爲多維char[3][2]數組(注意指數切換)。現在,我想打印這個矩陣。但是,由於某種原因,最後一列未打印。這是爲什麼?爲什麼不打印我矩陣的最後一列?

這裏是我的代碼:

#include <stdio.h> 

#define ARRAY_SIZE(x) ((sizeof (x))/(sizeof((x)[0]))) 

typedef char matrix[3][2]; 

void print_matrix(matrix a) 
{ 
    for (size_t i = 0; i < ARRAY_SIZE(a[0]); i++) { 
     printf("["); 
     for (size_t j = 0; j < ARRAY_SIZE(a); j++) { 
      printf(" %c", a[j][i]); 
     } 
     printf(" ]\n"); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    matrix a = {{'a','b'},{'c','d'},{'e','f'}}; 
    printf("sizeof(a) = %zu\n", ARRAY_SIZE(a)); 
    printf("sizeof(a[0]) = %zu\n", ARRAY_SIZE(a[0])); 
    print_matrix(a); 
    return 0; 
} 

編譯和運行使我這個:

$ gcc -Wall -std=c99 foo.c; ./a.out 
sizeof(a) = 3 
sizeof(a[0]) = 2 
[ a c ] 
[ b d ] 

預期輸出:

[ a c e ] 
[ b d f ] 

回答

2

地址:

printf("ARRAY_SIZE(a) = %zu\n", ARRAY_SIZE(a)); 
printf("ARRAY_SIZE(a[0]) = %zu\n", ARRAY_SIZE(a[0])); 

print_matrix,你會看到這個問題:

ARRAY_SIZE(a) = 2 
ARRAY_SIZE(a[0]) = 2 

您已經通過C.多維數組的離奇案件角落咬傷一個不爲完全支持因爲他們似乎是。特別是,將它們作爲參數傳遞給函數並不會創建您期望的數據類型,因此ARRAY_SIZE宏在函數參數上無法正常工作。實際上實際發生的事情很奇怪,而且我不確定我是否理解它足以真正解釋它,但簡要版本是數組作爲函數參數降級爲指針。所以函數參數char a [3] [2]實際上變成了與char * a [2]相似的東西。

3

那是因爲你的函數是有效的:

void print_matrix(char a[3][2]) 

但這是真的:

void print_matrix(char (*a)[2]) 

所以宏產生使用sizeof錯誤的結果(你計算指針的大小,和兩個元素的char數組的大小)。如果您將這兩個值作爲參數傳遞給函數並將其用於循環中,則應該起作用。

+0

感謝您的快速回復。你和rra的回答基本上是一樣的,但我已經接受了他的回答,因爲沒有其他原因,我只是先讀它:/ – hakoja 2013-03-18 00:03:29

0

sizeof運算符不起作用,因爲作爲參數發送的數組被轉換爲指針併發生指針的DECAYING!所以在函數內部,你無法知道矩陣的大小。