1

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

4

5 回答 5

4

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

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

std::cout << static_cast<int>( arr[index] ) << std::endl;
于 2012-11-21T16:23:39.377 回答
2

你想要做的有一个undefined behavior. 一些编译器会为您清除内存,其他编译器会将其保留为创建缓冲区之前的状态。

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

于 2012-11-21T16:16:17.553 回答
2

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

于 2012-11-21T16:20:36.563 回答
1

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

作为一个实验试试这个

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

看看||字符之间是否出现任何东西。

于 2012-11-21T16:14:15.050 回答
0

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

于 2012-11-21T16:17:37.157 回答