【问题标题】:output of the Program, in c++,&int to char* casting [duplicate]程序的输出,在 c++ 中,int 到 char* 转换 [重复]
【发布时间】:2013-11-09 21:45:30
【问题描述】:

谁能解释一下下面程序的输出:

int main()
{
    int i=512;
    char *c=(char*)&i;
    c[0]=1;
    cout<<"i is:"<<i<<endl;

    return 0;
}

输出为:513

【问题讨论】:

  • 你期待什么输出?
  • 正式,即UB,依赖平台
  • 我很高兴找到一个副本。
  • @BЈовић 为什么会是 UB?
  • @jrok: 打破别名规则?

标签: c++ pointers casting char int


【解决方案1】:

程序的输出unspecified。在实践中,这取决于您平台的字节顺序和int 类型的宽度。

您的平台是little-endian。为简单起见,我们假设 int 是 32 位宽。

51210 是十六进制的0x00000200。这在内存中存储为

00 02 00 00

您的代码将第一个字节修改为01。这会将int 更改为0x00000201,即513 十进制。

【讨论】:

  • 这是实现特定的值。使用char 进行别名是严格别名的明确例外。
  • 为什么它是未定义的行为?只要知道字节顺序,我就不明白为什么不应该明确定义正在发生的事情。那你能解释一下为什么是UB吗?
  • 我已经改写了答案。我相信现在是正确的。如果您不这么认为,请告诉我。
  • 好吧,如果它真的是UB那么之前的版本是正确的。我不知道是不是UB,我只是想知道你为什么会这样。
  • @leemes 只要知道字节序。 标准中哪里提到字节序?
【解决方案2】:

程序表现出未指定的行为,取决于机器的架构。要对输出进行预测和推理,需要了解编译器和目标架构。

【讨论】:

  • 有个理由就好了。
  • @leemes 原因是什么?为什么这是 UB 的原因?
  • 没错。你能引用一段话吗?或者这个程序究竟是什么?
  • @leemes 首先,reinterpret_cast(或 c-style cast)所做的是 UB
  • @leemes 不知道节目有没有正式展出UB。
【解决方案3】:

解释:

int main()
{
    /* Creates int equal to 512 */
    int i=512;

    /* Creates a char pointer, and points this at i */
    char *c=(char*)&i;

    /* Overwrites the lowest byte of the 4 byte int with 1 */
    /* This sets the lowest bit of the int, which adds 1 */
    c[0]=1;

    /* Displays the updated int */
    cout<<"i is:"<<i<<endl;

    return 0;
}

int 的哪一部分被覆盖取决于您正在编译的平台的 endianness。鉴于 513 的最终结果,您的系统显然是 little-endian。

【讨论】:

  • 您可能应该将您的解释限定为专门适用于小端架构。
  • 感谢您的建议。完毕! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多