从下面的代码
#include<stdio.h>
int main()
{
char *s;
s="cool man army"; //here LHS and RHS are same type
printf("ptr= %zd, normal string= %zd",sizeof(s),sizeof("cool man army"));
return 0;
}
[s
是char *
类型,并且"cool man army"
也是char *
,那么为什么输出ptr= 8, normal string= 14
不同?
字符串文字实际上是数组,而不是指针。 C standard的6.4.5p6节关于字符串文字的规定:
在翻译阶段7,值为零的字节或代码为附加到由字符串文字。多字节字符序列为然后用来初始化静态存储持续时间的数组和长度刚好足以包含序列。
因此,当它是sizeof
运算符的操作数时,对指针的通常衰减不会发生[[not,并且您获得以字节为单位的数组大小。
typeinfo标头:
看到它printf("%s %s", typeid(s).name(), typeid("cool man army").name());
看到类似的东西
Pc A14_c
您可以看到第二个是14个字符的数组。
我认为错误在这里:
s="cool man army"; //here LHS and RHS are same type
它们不是同一类型。字符串文字是字符数组,并且会分解为指针。字符串文字的类型为
char const[14]
。在C ++中,您可以创建对它的引用:
auto const& ref_to_literal = "cool man army"; assert(sizeof(ref_to_literal) == sizeof("cool man army")); // True!
声明
s = "cool man army";
其中s
的类型为char *
,仅在C中有效,在C ++中无效。在C ++中,变量s
必须为const char *
类型,因为该类型的字符串文字decays为该类型。只有在C中,字符串文字才会衰减为char *
类型。但是,在两种语言中,字符串文字都是只读的,即使它不是C中的const
。
在现代64位平台上,指针通常为64位,这就是sizeof(s)
为8字节(等效于64位)的原因。但是,字符串文字"cool man army"
不是指针(与sizeof运算符一起使用时也不会衰减为1)。因此,它的长度是字符串的实际长度(包括终止的空字符),为14。