我写了一段代码并使用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时,它会按预期显示垃圾值。有人可以向我解释一下吗?
答案 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)
您正在尝试使用未初始化数组中的值,因此您将获得未定义的行为。你不能指望任何特别的事情发生。也许每个角色恰好都是非打印角色。也许它只是决定它不想打印任何东西,因为它不喜欢你的小游戏。一切顺利。