我有一个具有char *
参数的函数A.在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 :(得分:2)
在main()
函数中,buf
是一个数组,因此sizeof buf
给出了此数组的大小:sizeof(char[128])
(128字节)。这是因为当用作sizeof
运算符的操作数时,数组不会转换指针。
在A()
函数中,p
是一个指针,因此sizeof p
给出了此指针的大小:sizeof(char *)
(实现时为8个字节)。< / p>
答案 1 :(得分:2)
sizeof(buf)
为128*sizeof(buf[0])
,而sizeof(p)仅为sizeof(char*)
。
答案 2 :(得分:1)
因为您打印指针的大小,而不是它指向的大小。数组衰减到指针,一旦你将它传递给一个函数,你就会有一个指针,并且会丢失原始数组的所有大小信息。
答案 3 :(得分:0)
当传入函数时,它会衰减为具有原始大小(4或8)大小的普通指针。
使用strlen(),因为它在末尾检查“null”,如果数组已经初始化,则给出正确的大小。