【发布时间】:2013-06-25 13:06:43
【问题描述】:
我有一个 C 代码:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
返回
20 8
我想知道 8 是怎么来的,谢谢!
【问题讨论】:
-
你在什么平台上编译?
标签: c
我有一个 C 代码:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
返回
20 8
我想知道 8 是怎么来的,谢谢!
【问题讨论】:
标签: c
sizeof(s1) 是内存中数组的大小,在您的情况下,20 个字符每个 1 字节等于 20。
sizeof(s) 是指针的大小。在不同的机器上,它可以是不同的大小。我的是 4。
要在您的机器上测试不同的类型大小,您可以只传递类型而不是像 printf("%zu %zu\n", sizeof(char*), sizeof(char[20])); 这样的变量。
它将在 32 位机器上分别打印 4 和 20。
【讨论】:
char* s 指向“fyc”的第一个字符。因此,如果您 printf *s,您会得到“fyc”的第一个字符,即“f”。单个字符重 1 个字节。这就是你得到 1 个字节的原因。
sizeof(char *)是指针的大小,一般32位机为4,64位机为8。
sizeof 一个数组,另一方面,输出数组的大小,在这种情况下,20*sizeof(char) = 20
还有一件事,您应该使用%zu 输入size_t,输入printf 格式。
printf("%zu %zu\n", sizeof(s1), sizeof(s));
【讨论】:
sizeof 运算符返回类型 的大小。 sizeof 的操作数可以是类型的括号名称或表达式,但无论如何,大小仅由操作数的类型决定。
sizeof s1 因此严格等价于sizeof (char[20]) 并返回20。
sizeof s 严格等同于sizeof (char*) 并返回指向char 的指针的大小(在您的情况下为64 位)。
如果你想要s指向的C字符串的长度,你可以使用strlen(s)。
【讨论】:
sizeof 可以很好地用于评估变量的大小:char c[2]; printf("%uz", sizeof(c)); 是正确的 C 并返回 2。但很可能正是您使用的措辞,才写下此评论。
sizeof 运算符要么应用于表达式,要么应用于类型的括号名称。当它应用于表达式时,编译器使用该表达式推断出的类型来确定sizeof 的值。表达式是变量或文字的事实并不相关,因为它只是使用的表达式的类型,而不是值。我将重新措辞以使我的观点更清楚。
8 是一个指针的大小,一个地址。在 64 位机器上它有 8 个字节。
【讨论】:
如果您使用的是 64 位计算机,则内存地址为 64 位,因此必须使用 64 位(8 字节 x 8 位/字节)数值来表示数字指针变量 (char*)。
换句话说,sizeof() 对指针的工作方式与对标准变量的工作方式相同。使用指针时只需要考虑目标平台即可。
【讨论】: