Cout 在循环访问常量字符时提供垃圾输出



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

#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

最后剩下的角色是什么?常量字符数组中是否有未考虑的内容?

while (*cp)

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

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

数组不包含空字符。

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

while循环,直到*cp等于 0。

此修复:

#include <iostream>
using std::cout;
using std::endl;
int main()
{
    const  char ca[] = { 'h', 'e', 'l', 'l', 'o', '' }; // <-- add ''
    const char* cp = ca;
    while (*cp) // loop until *cp equal ''
    {
        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;
    }
}

最新更新