【问题标题】:Displaying char array in gcc does not work在 gcc 中显示 char 数组不起作用
【发布时间】:2012-11-21 16:13:13
【问题描述】:

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了。所以基本上这里发生的事情是随机值不是可打印的 ascii 字符代码,这就是为什么我什么也没看到。非常感谢您指出这一点。
    【解决方案2】:

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

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

    【讨论】:

    • 从 C++ 标准使用该术语的意义上说,这并不是真正的“未定义行为”。 char 的所有值都必须有效,因此读取不确定的 char 值应该是完全合法且行为良好的。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在您的平台上不打印乱码。在另一个平台上可能会有所不同。

      作为一个实验试试这个

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

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

      【讨论】:

      • 更有可能“垃圾值”是0,不是吗?
      • @juanchopanza 更有可能的是,垃圾值是以前函数中发生的任何事情。出于安全原因,系统会将其为进程提供的所有内存初始化为零,但 crt0 可能在调用 main 之前调用了一些函数,这些函数可能会到处留下非零值。
      【解决方案5】:

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

      【讨论】:

      • 其实char 是个例外,我想。 (至少unsigned char 是,我认为C++ 将此保证扩展到char。)标准确实 允许char 具有任何陷阱表示,并且允许使用它来读取“原始内存”,包括未初始化的原始内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多