2

我注意到 C++ 中有一个奇怪的差异。

说我有这个代码:

const char myChars[] = "12345";
std::cout << myChars;

输出为:12345

但是,如果我将其更改为:

const char myChars[] = {'1','2','3','4','5'};
std::cout << myChars;

那么输出是:12345__SOME_RANDOM_DATA_IN_MEMORY__

为什么 cout 似乎知道第一个版本的长度而不知道第二个版本的长度?另外, cout 甚至知道长度吗?

谢谢。

4

5 回答 5

22

第二个示例中没有空终止符。

const char myChars[] = {'1','2','3','4','5', 0};

可以正常工作。

字符串文字需要一个空终止符来指示字符串的结尾。

有关更多详细信息,请参阅此 stackoverflow 答案:https ://stackoverflow.com/a/2037245/507793

至于您的第一个示例,当您使用引号创建字符串文字时"Hello",大致相当于{'H', 'e', 'l', 'l', 'o', 0},因为使用引号时空终止符是隐式的。

于 2013-01-10T16:33:51.163 回答
4

向编译器询问 sizeof(myChars) 并注意区别。字符串的结尾由一个空字符标记,当您使用“”时是隐含的。

于 2013-01-10T16:34:12.710 回答
2

当设置mychars[]为“12345”时,你隐式地'\0'在它的末尾添加一个,告诉程序这是字符串的结尾,而你没有{'1','2','3','4','5'};

于 2013-01-10T16:34:17.393 回答
2

C 字符串实现为以特殊字符结尾的 char 数组\0

字符串文字隐含地具有它。虽然花括号数组初始化不添加它。

您需要手动添加

const char myChars[] = {'1','2','3','4','5', '\0'};

或者干脆

const char myChars[] = {'1','2','3','4','5', 0};

因为 '\0' == 0 数值。

于 2013-01-10T16:34:35.083 回答
2
const char myChars[] = {'1','2','3','4','5','\0'};

不要忘记添加空终止字符串

于 2013-01-10T16:34:44.953 回答