17

我有一个 C 代码:

char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;

它返回

20 8

我想知道8是怎么来的,谢谢!

4

5 回答 5

22

sizeof(s1)是内存中数组的大小,在您的情况下,20 个字符,每个 1 字节等于 20。

sizeof(s)是指针的大小。在不同的机器上,它可以是不同的大小。我的是4。

要在您的机器上测试不同的类型大小,您可以只传递类型而不是像这样的变量printf("%zu %zu\n", sizeof(char*), sizeof(char[20]));

它将分别在 32 位机器上打印4和打印。20

于 2013-06-25T13:09:17.243 回答
14

sizeof(char *)是指针的大小,所以通常 4 用于 32 位机器,8 用于 64 位机器。

sizeof另一方面,数组输出数组的大小,在本例中为 20*sizeof(char) = 20

还有一件事,您应该使用%zufor size_ttype in printfformat。

printf("%zu %zu\n", sizeof(s1), sizeof(s));
于 2013-06-25T13:09:09.360 回答
8

sizeof运算符返回类型的大小。的操作数sizeof可以是类型或表达式的括号名称,但无论如何,大小仅由操作数的类型确定。

sizeof s1因此严格等价于sizeof (char[20])并返回20

sizeof s严格等同于sizeof (char*)并返回指向char(在您的情况下为64 位)的指针的大小。

如果您想要 所指向的 C 字符串的长度s,您可以使用strlen(s).

于 2013-06-25T13:10:00.317 回答
5

8是一个指针的大小,一个地址。在 64 位机器上它有 8 个字节。

于 2013-06-25T13:09:00.953 回答
1

如果您使用的是 64 位计算机,则内存地址为 64 位,因此必须使用 64 位(8 字节 x 每字节 8 位)数值来表示数字指针变量 (char*)。

换句话说,sizeof() 对指针的工作方式与对标准变量的工作方式相同。您只需要在使用指针时考虑目标平台。

于 2013-06-25T13:13:54.713 回答