最近,我刚学过c++语言,因为有人教我:
char x[6] = "hello"; //OKchar 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()只有在找到'\0‘来确定char数组的长度时才会停止,在这种情况下,strlen(x)返回什么?
谢谢!
发布于 2021-03-05 14:59:38
字符串文本"hello"有六个字符,因为有一个隐含的nul终止符。所以
char x[] = "hello";定义一个6个char的数组。这几乎总是您想要的,因为C风格的字符串函数(strlen、strcpy、strcat等)操作C样式的字符串,定义为nul终止。
但这并不意味着每个char数组都将被nul终止。
char x[] = { 'h', 'e', 'l', 'l', 'o' };这定义了一个由五个char组成的数组。将C样式的字符串函数应用于此数组将导致未定义的行为,因为该数组没有nul终止符。
您可以通过显式地包含nul结束符来进行逐字符初始化并创建有效的C样式字符串:
char x[] = { 'h', 'e', 'l', 'l', 'o', '\0' };这定义了一个包含6个char的数组,该数组包含一个C样式的字符串(即以nul结尾的字符序列)。
这里的关键是将char数组的一般概念与包含C样式字符串的char数组的更具体概念区分开来。后者几乎总是你想要做的,但这并不意味着对前者没有任何用处。只是前者不常见。
顺便说一句,在C中,您可以使用nul终结者:
char x[5] = "hello";这是合法的C,它创建了一个5 char的数组,没有nul终止符。在C++中,这是不合法的。
https://stackoverflow.com/questions/66488058
复制相似问题