初始化char数组而不将放在string的末尾



我是c++语言的新手,最近,因为我被教导:

  • 我们应该在初始化时在char数组的末尾加上'',例如:

    char x[6] = "hello"; //OK

  • 但是,如果您这样做:

    char x[5] = "hello";

    那么这会引发错误:

    initializer-string for array of chars is too long

一切都如我所愿,直到下面的表达式没有引发编译错误…:

char x[5] = {'h','e','l','l','o'};

这真的让我很困惑,所以我想问两个问题:

1。为什么表达式char x[5] = "hello";不报错?

2。据我所知,strlen()函数只有在找到''以确定字符数组的长度时才会停止,在这种情况下,strlen(x)会返回什么?

谢谢!

字符串字面量"hello"有六个字符,因为有一个隐含的空结束符。所以

char x[] = "hello";

定义了一个包含6个char的数组。这几乎总是你想要的,因为c风格的字符串函数(strlen,strcpy,strcat等)操作的是c风格的字符串,根据定义,这些字符串以null结束。

但这并不意味着char的每个数组都将以null终止。

char x[] = { 'h', 'e', 'l', 'l', 'o' };

定义了一个包含5个char的数组。对该数组应用c风格的字符串函数将导致未定义的行为,因为该数组没有空结束符。

您可以通过显式地包含空结束符来逐个字符初始化并创建一个有效的c风格字符串:

char x[] = { 'h', 'e', 'l', 'l', 'o', '' };

这定义了一个包含6个char的数组,它保存一个c风格的字符串(即,一个以null结尾的字符序列)。

这里的关键是在您的头脑中区分char数组的一般概念和保存c风格字符串的char数组的更具体概念。后者几乎总是你想要做的,但这并不意味着前者没有用处。只是前者并不常见。

作为题外话,在C中允许省略空终止符:

char x[5] = "hello";

这是合法的C语言,它创建了一个5char的数组,没有null终止符。在c++中,这是不合法的。

为什么表达式char x[5] = "hello";不引发错误?

这不是真的。在这种情况下,出现错误是预料之中的。

据我所知,strlen()函数只有在找到''来确定char数组的长度时才会停止,在这种情况下,strlen(x)会返回什么?

如果你可以运行代码,程序将经历一个未定义的行为。也就是说,你不会得到你所期望的。strlen()只会在发现null终止符时停止计数,也就是说,它可能会在char数组的初始化部分之外访问未初始化的部分-这是UB被调用的地方。

最新更新