1

我有一个有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

请告诉我原因。

4

4 回答 4

2
  • main()函数中,buf是一个数组,所以sizeof buf给出这个数组的大小:sizeof(char[128])(128 字节)。这是因为数组在用作运算符的操作数时不会转换sizeof为指针。

  • A()函数中,p是一个指针,因此sizeof p给出了该指针的大小:(sizeof(char *)在您的实现中为 8 个字节)。

于 2013-07-02T11:14:24.060 回答
2

sizeof(buf)128*sizeof(buf[0])并且 sizeof(p) 只是sizeof(char*).

于 2013-07-02T11:14:35.333 回答
1

因为您打印的是指针的大小,而不是它指向的内容。数组衰减为指针,一旦你将它传递给一个函数,你就会有一个指针,并且会丢失原始数组的所有大小信息。

于 2013-07-02T11:14:01.440 回答
0

当传递给函数时,它会衰减为一个普通指针,其大小与您的本机大小(4 或 8)相同。

使用 strlen() 因为它在末尾检查“null”,如果数组已经初始化,则给出正确的大小。

于 2013-07-02T11:16:23.200 回答