C 作为函数参数的字符指针

C 作为函数参数的字符指针,c,sizeof,C,Sizeof,我有一个函数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);

我有一个函数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中):


请告诉我原因。

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

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

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

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

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

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


      sizeof(buf)
      128*sizeof(buf[0])
      而sizeof(p)只是
      sizeof(char*)

      sizeof(buf)
      128*sizeof(buf[0])
      而sizeof(p)只是
      sizeof(char
      当传递到函数中时,它会衰减到一个普通指针大小(4或8)


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

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


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

      也就是说,在函数中,除了添加一个大小参数外,我无法获取大小信息。对吗?也就是说,在函数中,除了添加一个size参数外,我无法获取大小信息。对吗?不要对sizeof()使用%d,而是使用%zu。%d只会给sizeof()带来麻烦,因为它的大小不是int。不要将%d用于sizeof(),而是使用%zu。%d只会给sizeof()带来麻烦,因为它的大小不是
      128*sizeof(buf[0])的整数+1。实际上,没有人强调在数组的情况下,sizeof实际上返回
      (arraysize)*(数据类型需要的字节)
      +1表示
      128*sizeof(buf[0])。实际上,没有人强调在数组中,sizeof实际上返回
      (arraysize)*(数据类型所需的字节)
      sizeof buf is 128
      sizeof p is 8