有问题的代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
cout << sizeof("\n\r\t") << endl; // prints 4
cout << strlen("\n\r\t") << endl; // print 3
return 0;
}
我很困惑,因为我一直认为sizeof
char总是1字节是标准的,但在上面的代码中,它是打印4。
是否有此解释或此规则是否存在转义字符的例外情况?请赐教我
答案 0 :(得分:6)
这里唯一的区别是strlen不包括空终止字符sizeof。 C documentation for strlen在这种情况下实际上更好,因为它包含声明:
从长度中排除空字符。
为了澄清一点,字符串文字是一个包含空终止字符的数组,来自草案C ++标准部分2.14.5
字符串文字段 8 表示:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。
和段 15 说:
应用于数组的[...]窄字符串文字的大小是转义序列和其他字符的总数,加上至少一个用于每个通用字符名称的多字节编码,加上一个用于终止'\ 0 ”。
和sizeof将为您提供数组中5.3.3
大小段 3 的总字节数:
[...]当应用于数组时,结果是数组中的总字节数。这意味着n个元素的数组大小是元素大小的n倍。
答案 1 :(得分:4)
此
"\n\r\t"
是一个所谓的字符串文字。它作为常量字符数组存储在内存中,终止为零。每个转义字符都是一个字符。
所以这个字符串文字有三个明确指定的字符加上terminatimg零。总的来说,文字中有四个字符。
对于函数strlen
,它没有考虑终止零。因此它只会报告在字符串文字中明确指定的三个字符。
函数strlen
使用终止零作为标记,它将停止计算字符串中的字符。
对于运算符sizeof
,它返回对象占用的总内存(以字节为单位)。由于您的字符串文字具有类型const char[4]
,因此sizeof将返回4.它是字符串文字占用的总内存(以字节为单位)。
答案 2 :(得分:2)
字符串以空值终止,因此末尾有空字符\0
。
\n
,\r
,\t
和\0
都是一个字节大小,因此共计4个字节!
从选定的this question答案中摘录一下,与之相吻合:
字符串文字具有[const] char&#39;的大小为N的类型&#39;数组。哪个N. 包括终端null。
请记住,传递给sizeof时,数组不会衰减为指针。
答案 3 :(得分:1)
通过在字符串文字上调用sizeof()
,您确实试图在内存中找到字符串文字的大小。
这包括空终止字符,它由编译器自动附加到字符串文字。