C 作为函数参数的字符指针
我有一个函数a,它有一个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);
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
(128字节)。这是因为当数组用作sizeof(char[128])
运算符的操作数时,它不会转换为指针sizeof
- 在
函数中,A()
是一个指针,因此p
给出了该指针的大小:sizeof p
(实现中有8个字节)sizeof(char*)
- 在
函数中,main()
是一个数组,因此buf
给出了该数组的大小:sizeof buf
(128字节)。这是因为当数组用作sizeof(char[128])
运算符的操作数时,它不会转换为指针sizeof
- 在
函数中,A()
是一个指针,因此p
给出了该指针的大小:sizeof p
(实现中有8个字节)sizeof(char*)
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