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