我有一个C代码:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
返回
20 8
我想知道8是怎么来的,谢谢!
答案 0 :(得分:19)
sizeof(s1)
是内存中数组的大小,在你的情况下,20个字符,每个字节等于20个。
sizeof(s)
是指针的大小。在不同的机器上,它可以是不同的尺寸。我的是4岁。
要在您的计算机上测试不同的类型大小,您只需传递类型而不是像printf("%zu %zu\n", sizeof(char*), sizeof(char[20]));
这样的变量。
它将分别在32位计算机上打印4
和20
。
答案 1 :(得分:13)
sizeof(char *)
是指针的大小,因此对于32位机器通常为4,对于64位机器通常为8。
sizeof
数组输出数组的大小,在本例中为20 * sizeof(char)= 20
还有一件事,您应该%zu
使用size_t
以printf
格式输入。
printf("%zu %zu\n", sizeof(s1), sizeof(s));
答案 2 :(得分:6)
8是指针的大小,地址。在64位机器上它有8个字节。
答案 3 :(得分:5)
sizeof
运算符返回类型的大小。 sizeof
的操作数可以是类型的括号名称或表达式但在任何情况下,大小仅由操作数的类型确定
sizeof s1
严格等同于sizeof (char[20])
并返回 20 。
sizeof s
严格等同于sizeof (char*)
,并返回指向char
的指针的大小(在您的情况下为 64位)。
如果您想要s
指向的C字符串的长度,则可以使用strlen(s)
。
答案 4 :(得分:2)
如果您使用的是64位计算机,则内存地址为64位,因此必须使用64位(每字节8字节x 8位)数值来表示数字指针变量(char *)。
换句话说,sizeof()对于指针和标准变量的工作方式相同。您只需在使用指针时考虑目标平台。