首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不用将\0放在字符串末尾,就可以初始化char数组

不用将\0放在字符串末尾,就可以初始化char数组
EN

Stack Overflow用户
提问于 2021-03-05 06:54:31
回答 2查看 191关注 0票数 0

最近,我刚学过c++语言,因为有人教我:

  • 在进行初始化时,我们应该将'\0‘放在char数组的末尾,例如: char x[6] = "hello"; //OK
  • 然而,如果你这样做了: char x[5] = "hello"; 然后,这将引发错误: initializer-string for array of chars is too long

所有事情都按照我的预期进行,直到下面的发布不会引发编译错误.:

代码语言:javascript
复制
char x[5] = {'h','e','l','l','o'};

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

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

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

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2021-03-05 14:59:38

字符串文本"hello"有六个字符,因为有一个隐含的nul终止符。所以

代码语言:javascript
复制
char x[] = "hello";

定义一个6个char的数组。这几乎总是您想要的,因为C风格的字符串函数(strlenstrcpystrcat等)操作C样式的字符串,定义为nul终止。

但这并不意味着每个char数组都将被nul终止。

代码语言:javascript
复制
char x[] = { 'h', 'e', 'l', 'l', 'o' };

这定义了一个由五个char组成的数组。将C样式的字符串函数应用于此数组将导致未定义的行为,因为该数组没有nul终止符。

您可以通过显式地包含nul结束符来进行逐字符初始化并创建有效的C样式字符串:

代码语言:javascript
复制
char x[] = { 'h', 'e', 'l', 'l', 'o', '\0' };

这定义了一个包含6个char的数组,该数组包含一个C样式的字符串(即以nul结尾的字符序列)。

这里的关键是将char数组的一般概念与包含C样式字符串的char数组的更具体概念区分开来。后者几乎总是你想要做的,但这并不意味着对前者没有任何用处。只是前者不常见。

顺便说一句,在C中,您可以使用nul终结者:

代码语言:javascript
复制
char x[5] = "hello";

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

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66488058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档