我声明C ++数组如下。数组大小为5,字符数为5.但我有错误:initializer-string for array of chars is too long
当我将数组大小更改为6或为空时,则没有错误。这是为什么?
#include <iostream>
using namespace std;
int main()
{
char name[5] = "ABCDE";
cout<<name;
return 0;
}
答案 0 :(得分:2)
因为最后有一个空字符,所以大小应为6
。
请参阅string literal:
始终追加空字符(
'\0'
,L'\0'
,char16_t()
等) 到字符串文字:因此,字符串文字"Hello"
是const char[6]
持有字符'H'
,'e'
,'l'
,'l'
,'o'
和'\0'
。
当initialize character arrays时,
如果初始化器子句的数量超过了初始化的成员和基数(从C ++ 17开始),则程序格式错误(编译器错误)
编译失败。
并且您根本不需要指定大小,只需char name[] = "ABCDE";
就可以帮助您避免此类麻烦。
字符串文字可用于初始化字符数组。如果数组初始化为
char str[] = "foo";
,则str
将包含字符串"foo"
的副本。
答案 1 :(得分:1)
字符串以空值终止。 这意味着什么?
这意味着他们需要一个额外的字符来存储空字符以指示字符串的结尾。
想象一个函数解析&#34; ABCDEF&#34;,它如何知道字符串何时结束并且不会侵入内存的其他部分? 答:它只知道因为空字符&#39; \ 0&#39;
这就是你需要用一个额外字符来声明它的原因。
举例来说,想象一下这段代码:
#include <stdio.h>
int main() {
char name[5] = "ABCDE";
char test[] = "ANYTHING";
printf("Hello, %s\n", name);
}
你认为它会打印什么? &#34; ABCDE&#34;,对吧?
实际输出:
你好,ABCDEANYTHING
这是因为printf试图找到字符串的结尾(第一个空字符),但只有当它在不正确的内存访问中已经遍历 test 变量时才会找到它。
这是一个很好的场景&#34;,在最坏的情况下,你的程序会因缓冲区溢出而崩溃,并可能留下区域用于安全利用。
答案 2 :(得分:0)
编译器使用null \0
终止字符隐式终止字符串文字。因此,您声明的每个字符串文字实际上都有一个额外的\0
字符。
char name[6] = "ABCDE"; // <-- Actually [ABCDE\0]
char name[] = "ABCDE"; // <-- Compiler figures it out