在gcc中显示char数组不起作用

时间:2012-11-21 16:13:14

标签: c++

我写了一段代码并使用gcc编译器

进行了测试
#include <iostream>

int main()
{
    char arr[ 1000 ];
    for( int index( 0 ); index < 1000; ++index )
    {
        std::cout << arr[ index ] << std::endl;
    }
    return 0;
}

我希望它能打印垃圾值,但令我惊讶的是,它没有打印任何东西。当我简单地将arr的数据类型从char更改为int时,它会按预期显示垃圾值。有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:4)

<<对字符类型的重载不会将它们视为 整数类型,但作为字符。如果垃圾值 对应于可打印字符(例如97,其对应 到'a'),你会看到它。如果没有(例如0),你就不会。 如果垃圾值对应于某些转义序列 这导致您的终端在黑色背景上使用黑色前景,您将看不到任何其他内容,句号。

如果您想查看char的实际数值(或 任何字符类型),只需将变量转换为int 输出它:

std::cout << static_cast<int>( arr[index] ) << std::endl;

答案 1 :(得分:2)

你要做的是undefined behavior。有些编译器会为你清除内存,其他编译器会在创建缓冲区之前保留它。

总的来说,这是一项无用的测试。

答案 2 :(得分:2)

某些平台可能会选择(例如出于安全目的)使用零填充未初始化的char数组,即使它不是静态的并且未显式初始化。 因此,这就是没有垃圾出现的原因 - 您的char数组只是自动初始化。

答案 3 :(得分:1)

在您的平台上,垃圾字符不会打印。在另一个平台上可能会有所不同。

作为实验试试这个

std::cout << '|' << arr[ index ] << '|' << std::endl;

查看||字符之间是否有任何内容。

答案 4 :(得分:0)

您正在尝试使用未初始化数组中的值,因此您将获得未定义的行为。你不能指望任何特别的事情发生。也许每个角色恰好都是非打印角色。也许它只是决定它不想打印任何东西,因为它不喜欢你的小游戏。一切顺利。