2008-09-08 137 views
15

爲什麼n在下面的函數中不等於8不同尺寸的結果

void foo(char cvalue[8]) 
{ 
    int n = sizeof (cvalue); 
} 

n確實等於8在這個版本的功能:

void bar() 
{ 
    char cvalue[8]; 
    int n = sizeof (cvalue); 
} 

回答

45

因爲你不能將整個數組作爲函數參數C.你實際上是在傳遞指針對它;括號是句法糖。不能保證你指向的數組大小爲8,因爲你可以通過這個函數任意你想要的字符指針。

// These all do the same thing 
void foo(char cvalue[8]) 
void foo(char cvalue[]) 
void foo(char *cvalue) 
+3

更喜歡語法氰化物... – 2015-12-21 12:23:07

1

在第一個例子,cvalue作爲傳遞的參數是真的只是一個指向一個字符數組,當你把它的sizeof(),你得到的指針的大小。在第二種情況下,您已將其聲明爲局部變量,您將獲得整個數組的大小。

0

32位系統上的參數大小將爲4,在使用-m64編譯的64位系統上的大小將爲8.這是因爲數組作爲函數中的指針傳遞。指針只是一個內存地址。

14

C和C++數組不是頭等對象;你不能將數組傳遞給函數,它們總是衰減到指針。

但是,您可以將指針和引用傳遞給數組。這可以防止數組邊界衰減。所以這是合法的:

template<typename T, size_t N> 
void foo(const T(&arr)[N]) 
{ 
    int n = sizeof(arr); 
} 
+2

你值得擁有更多的upmods爲你的聰明的解決方案。 – 2009-05-20 11:03:27