2013-07-02 111 views
1

我有一個函數A,它有一個char *參數。在A()中,我用sizeof來計算buf的大小,但是我在i686機器中得到了8個,而在armel機器中得到了4個。爲什麼不是128?該片段是如下:字符指針作爲函數參數

void A(char *p) 
{ 
    printf("sizeof p is %d\n", sizeof(p)); 
} 

int main(void) 
{ 
    char buf[128]; 
    printf("sizeof buf is %d\n", sizeof(buf)); 
    A(buf); 
    return 0; 
} 

的結果是這樣的(在i686的):

sizeof buf is 128 
sizeof p is 8 

請告訴我原因。

+0

請勿使用%d作爲sizeof(),而應使用%zu。 %d只會導致sizeof()的麻煩,因爲它的size_t不是int。 – Thomas

回答

1

因爲您打印指針的大小,而不是它指向的內容。數組衰減指針,只要你將它傳遞給一個函數,你就有一個指針,並且鬆散原始數組的所有大小信息。

+0

也就是說,在函數中我無法獲得大小信息,除了添加大小參數。對? –

+0

@ccsnailpp是的,這是正確的。 –

2
  • main()功能,buf是一個數組,所以sizeof buf給出了該數組的大小:sizeof(char[128])(128個字節)。這是因爲當作爲sizeof運算符的操作數使用時,數組不是轉換成時的指針。

  • A()功能,p是一個指針,所以sizeof p給這個指針的大小:sizeof(char *)(您的實現8字節)。

2

sizeof(buf)128*sizeof(buf[0])和sizeof(p)是剛剛sizeof(char*)

+0

+1爲'128 * sizeof(buf [0]);'。實際上,沒有人強調過,在數組的情況下,sizeof實際返回'(arraysize)*(數據類型所需的字節)'。 – 0decimal0

+0

很好的解釋 –

0

當傳入函數時,它會衰減到一個普通指針,它的大小是原生大小(4或8)。

使用strlen(),因爲它在最後檢查「null」,並在數組已經初始化時給出正確的大小。