-3

执行以下代码时,我得到了我所期望的以及一些意外的输出:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = {'h', 'e', 'l', 'l', 'o'};
    const char *cp = ca;
    while (*cp)
    {
        cout << *cp << endl;
        ++cp;
    }
}

输出:

h
e
l
l
o
ⁿ
■
m

最后剩下的字符是什么?const char 数组中是否存在未被考虑的内容?

4

2 回答 2

5
while (*cp)

此循环在cp指向空字符时结束。

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

该数组不包含空字符。

因此,循环遍历数组,并在其边界之外。访问超出其边界的数组的行为是未定义的。

于 2019-06-10T17:09:25.547 回答
2

while循环直到*cp等于 0 。

此修复:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; // <-- add '\0'
    const char* cp = ca;
    while (*cp) // loop until *cp equal '\0'
    {
        cout << *cp << endl;
        ++cp;
    }
}

或这个:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = { "hello" };
    const char* cp = ca;
    while (*cp)
    {
        cout << *cp << endl;
        ++cp;
    }
}
于 2019-06-10T17:13:26.903 回答