2016-03-08 47 views
1

如果我定義的2D陣列如:sizeof運算

char *tablechar[][2] = { 
     {"0", "Innova"}, 
     {"2", "Brio" }, 
     {"3", "Alto" }, 
     {"4", "Bolero"}, 
     {"5", "Swift" } 
}; 

和代碼在相同的文件中:

printf("Value = %d\n",sizeof(tablechar)); 
printf("Value = %d\n",sizeof(tablechar[0])); 
printf("Num of rows = %d\n",sizeof(tablechar)/sizeof(tablechar[0])); 

輸出爲預期:

Value = 40 
Value = 8 
Num of rows = 5 

現在,我將這個2D矩陣傳遞給一個函數,其定義如下:

void printstuff(char *tab[][2]) 
{ 
    printf("Value = %d\n",sizeof(tab)); 
    printf("Value = %d\n",sizeof(tab[0])); 
    printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0])); 
} 

我得到以下輸出:

Value = 4 
Value = 8 
Num of rows = 0 

與編譯器警告在上面的功能:

compiler_warning

爲什麼會這樣認爲的sizeof的值(標籤)和sizeof(tablechar)不同?

+1

4是指針的大小。 –

+1

[如何找到'sizeof'(一個指向數組的指針)]]的可能的副本(http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to -an-array) –

+1

[C編程語言中數組的大小?](https://stackoverflow.com/questions/1975128/sizeof-an-array-in-the-c-programming-language?) – kaylum

回答

4

tablechar是一個實際的陣列,但參數tab將被視爲一個指向具有特定類型的陣列元素,所以sizeof(tab)將指針的大小而sizeof(tablechar)將所述陣列的大小。

順便說一下,將具有錯誤類型的數據傳遞到printf()調用未定義的行爲。您將不得不使用%zu而不是%d來打印size_t,運營商將對其進行評估。

+0

明白了, 謝謝! –

+0

有沒有什麼辦法可以將二維數組的形式參數放入一個可以破譯爲數組本身而不是指針的函數中? –

2

tablecharchar指針數組的陣列,而函數參數tab是指向數組指針的指針。

void printstuff(char *tab[][2]) 

相當於

void printstuff(char *(*tab)[2]) 

sizeof(tab)會給指針不是數組tablechar的大小。在C中,有一種方法可以將數組傳遞給函數。當你將一個數組傳遞給一個函數時,然後按照C規則數組衰減來指向它的第一個元素。
請務必記住數組不是指針

+0

明白了,謝謝! –

1

爲:

char *tablechar[][2] = { 
     {"0", "Innova"}, 
     {"2", "Brio" }, 
     {"3", "Alto" }, 
     {"4", "Bolero"}, 
     {"5", "Swift" } 
}; 

類型的tablechar是具有five元件陣列,每個元素的類型是char* [2]。所以sizeof(tablechar) = 5 * sizeof(char* [2]) = 5 * 8 = 5 * 4 * 2

該類型如果tablechar[0]char* [2],那麼sizeof(tablechar[0]) = sizeof(char*) * 2 = 4 * 2 = 8

void printstuff(char *tab[][2]) 
{ 
    printf("Value = %d\n",sizeof(tab)); 
    printf("Value = %d\n",sizeof(tab[0])); 
    printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0])); 
} 

類型的tabchar**,所以sizeof(tab) = 4tab[0]的類型是char* [2],所以sizeof(tab[0]) = 8

+0

明白了,謝謝! –