2013-07-02 169 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”,并在数组已经初始化时给出正确的大小。