在 gcc 中显示字符数组不起作用



我写了一段代码并用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 时,它按预期显示了垃圾值。有人可以向我解释一下吗?

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

如果

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

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

您要执行的操作具有undefined behavior。一些编译器会为您清除内存,其他编译器会将其保留在创建缓冲区之前的状态。

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

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

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

作为实验,请尝试此

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

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

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

最新更新