为什么输出字符数组到控制台时会得到垃圾值?

时间:2013-11-28 14:35:46

标签: c++

当我输出我的阵列时,我总是得到像这样的'ýýýýý«««««««««îþþþ'的垃圾值。我做错了什么?

void func()
{
    const int size = 100;
    char * buffer = new char[size];
    for(int i=0; i<size; i++)
        buffer[i] = ' ';

    cout<<buffer;
}

但是,如果我使用for循环输出缓冲区,则没有垃圾值。

2 个答案:

答案 0 :(得分:7)

因为您没有空终止缓冲区,std::cout.operator<<(char*)将尝试查找\0作为其终止字符。

正如评论中指出的那样,随意将\0附加到缓冲区的末尾:)。

答案 1 :(得分:0)

ScarletAmaranth是对的。 C样式字符串(char数组)必须以char'\ 0'结束。这就是使用char数组的函数(在本例中为cout)知道字符串何时在内存中完成的方式。如果忘记数组末尾的'\ 0'字符,cout将打印数组中的所有字符,然后在数组后打印内存中的所有数据。这些其他数据都是垃圾,这就是你看到这些奇怪角色的原因。

如果使用字符串类型(更多C ++样式)而不是char数组,则不会出现此问题,因为字符串类型不使用'\ 0'作为字符串分隔符。

另一方面,当使用循环迭代数组的100个元素时,您不会看到垃圾,因为您只打印了这100个字符。我的意思是,你可以准确控制你正在打印的内容并知道何时停止,而不是让cout函数找出何时停止打印。