为什么 sizeof( "string" ) 打印的长度比 "string" 的长度多一个?
Why does sizeof("string") prints one more than the length of "string"?
# include <stdio.h>
int main()
{
int a = sizeof("string");
printf("%d", a );
return 0;
}
上面的代码打印 7 作为输出,而字符串的长度仅为 6。有人可以解释一下吗?
这是正在发生的事情:
- 字符串文字
"string"
是一个 (const
( 字符数组,包括一个 null 终止符字符,即{'s', 't', 'r', 'i', 'n', 'g', ' '}
.在您的示例中,所述数组有 7 个元素。 - 运算符
sizeof
应用于数组时会产生其大小(以字节为单位(。 - 数组的大小是其每个元素的大小之和。
- 一
char
的大小为 1。
因此,您可以获得文本中显式的字符数,以及一个 null 终止符。
此行为在 C 和 C++ 中是相同的
c中的所有字符串,甚至你像"string"
一样写的字符串都以空字节' '
结尾。
C 或 C++ 代码中的表达式"string"
被视为字符串文字,这意味着一个看起来像这样的字符数组:{'s','t','r','i','n','g',' '}
.在 c 和 c++ 中,所有字符串都必须由内存中的空字节终止,否则函数无法识别其结尾。
顺便说一下,这也是为什么在计算 c 代码中字符数组的长度时必须添加 1 个字符以考虑空字节的原因。因此,如果要将"string"
存储在声明的字符数组中,则必须执行char array[7];
在此处使用 6 会导致未定义的行为。
字符串的长度为 6,当我们在 " 中指定字符串时,默认情况下也会添加空字符。所以它打印了 7。
字符串
以 null 结尾并存储为包含字符的数组,并以空字符(' '
,在 ASCII 中称为 NUL(结尾。所以你有:
s | t | r | i | n | g | |
^-- 7th char
因为"string"
隐式地添加了' '
字符。
相关文章:
- 如果我注释掉换行符,为什么'string'会成为一个不合格的变量
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- cv::String 和 std::string:何时使用哪一个以及必须同时使用两者?
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 实现一个想要模拟 std::string 但在将其push_back向量时卡住的类
- std::string_view 的优点 当传递给另一个采用 std::string 的函数时
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 为什么在这个分解的 std::string dtor 中有一个锁定的 xadd 指令?
- 返回一个 std::string,转换为 char*
- C 使用默认限制的迭代器创建一个空的std :: String
- 字符串构造函数将两个字符* 放入另一个 std::string 在 C++14 中有效,但不适用于 C++17
- 为什么string.empty()在字符串包含一个值时评估为true
- "vector<string>"作为函数参数传递,我得到一个错误
- 我收到一个" conversion from ‘std::string (*)[50]’ to non-scalar type ‘std::string’ requested"错误,似乎无法修复它
- 将 C++ std::string 中的字符/字符序列替换为另一个字符序列
- 用一个字符制作 std::string 的最佳方法是什么?
- std::move在将std::string移动到另一个线程时出错
- "std::string + char"表达式会创建另一个 std::string 吗?