【问题标题】:Initialized char array with unknown element in c++ [duplicate]在c ++中初始化具有未知元素的char数组[重复]
【发布时间】:2017-05-23 20:38:52
【问题描述】:

这是我的代码:

const char ca[] = {'h','e','l','l','o'};
const char* cp = ca;
while(*cp){
    std::cout<<*cp<<" ";
    ++cp;
}

输出:

h e l l o  `

为什么数组末尾有一些 char 值?

【问题讨论】:

  • 超出范围,在数组末尾添加 \0 字符...
  • 当您编写 {'h','e','l','l','o'} 而不是 "hello" 时,编译器不会为您添加“nul 终止符”。
  • 在不添加 '\0' 的情况下遍历该 char 数组:for(size_t i = 0; i &lt; sizeof(ca)/sizeof(ca[0]); ++i){ std::cout &lt;&lt; ca[i] &lt;&lt; ' '; }
  • 如果你能用C++11那就更简单了:for(auto c: ca){ std::cout &lt;&lt; c &lt;&lt; ' '; }

标签: c++ arrays string loops char


【解决方案1】:

您正在调用未定义的行为,因为您这样做了:

const char ca[] = {'h','e','l','l','o'};
const char* cp = ca;
while(*cp) {

没有 null 终止符 附加到您的字符串。结果,您将越界,这意味着您正在访问不属于该数组的内存,因此您会看到非预期的字符。

要添加空终止符,只需这样做:

const char ca[] = {'h','e','l','l','o', '\0'};

好读:How dangerous is it to access an array out of bounds?

【讨论】:

  • 有道理!但是循环是如何终止的呢?
  • @NimitPatel 当您越界时,循环将继续到某个点,此时 while 循环的条件为假。否则很可能会导致分段错误!我更新了我的答案! ;)
【解决方案2】:

您应该将'\0' 作为数组中的最后一个元素,否则while(*cp) 始终为真,直到偶然遇到空终止符'\0'

尝试:

const char ca[] = {'h','e','l','l','o','\0'};
    const char* cp = ca;
    while(*cp){
        std::cout<<*cp<<" ";
        ++cp;
    }

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2016-11-21
    相关资源
    最近更新 更多