2016-03-29 44 views
0
#include <stdio.h> 
int a[3] = {1,2,3}; 

void cal(int* item){ 
    printf("Length(inside) is %lu\n", sizeof(item)/sizeof(item[0])); 
} 

int main(){ 
    printf("Length(outside) is %lu\n", sizeof(a)/sizeof(int)); 
    cal(a); 
} 

上面的代碼出來,其結果是計數數組長度,答案是錯的

Length(outside) is 3 
Length(inside) is 2 

然而,這是錯誤的,因爲他們都應該是3,什麼是錯的用我的代碼?

+2

指針的大小是指針的大小,而不是指向的指針大小。如果你需要數組的長度,你需要將它作爲參數傳遞給函數。 –

回答

0

首先,你應該的區別正在使用%zu格式說明符來打印結果。

其次,當傳遞給函數作爲參數時,數組名稱衰減到指向第一個元素的指針,所以sizeof(item)將無法​​按預期工作。

基本上你正在做的是sizeof (int *)/ sizeof (int),在你的環境中,很可能是一個指針佔用8個字節和int需要4,所以你得到這樣的結果。

+0

像「衰變」這樣的詞對新手來說並不意味着什麼,除非你專門定義它們。 –

0

這是因爲當數組傳遞給函數時,數組會衰減爲指針。

所以基本上你在做什麼是

sizeof(int*)/sizeof(int); 

什麼你能想到的是

int a[5]; 
sizeof(a)/sizeof(a[0]); //this works 

int a[5]; 
int* p = a; 
sizeof(p)/sizeof(p[0]); 
+0

它爲什麼衰減?我認爲它不應該?有什麼問題? –