【问题标题】:C Program Prints Unexpected Word. How does this happen?C 程序打印意外的字。这是怎么发生的?
【发布时间】:2015-05-24 01:32:41
【问题描述】:

有人知道这是怎么回事吗?

C 程序源码:

int main ()
{
    float b[] = {1.143139e+27};
    puts(b);

    return 0;
}

输出:

Fell

为什么这个程序会显示“Fell”?

【问题讨论】:

  • 浮点 1.143139e+27 = 十六进制 46656C6C = ascii Fell
  • 使用实现定义的方面很可能导致未定义的行为......这个问题是无效的。
  • 未定义的行为。没有人知道字符串在这 4 个字节之后何时停止

标签: c arrays floating-point return puts


【解决方案1】:

它与1.143139e+27 的字节表示有关,它恰好是Fell,但没有终止nul 字节。

你可以做相反的过程,比如

#include <stdio.h>

int main()
{
    char b[] = {'F', 'e', 'l', 'l'};
    fprintf(stdout, "%g\n", *(float *)b);

    return 0;
}

甚至添加一个终止nul字节,

#include <stdio.h>

int main()
{
    char b[] = {'F', 'e', 'l', 'l', '\0'};
    fprintf(stdout, "%g\n", *(float *)b);

    return 0;
}

这意味着将float b[] = {1.143139e+27};更改为float b[] = {1.14314e+27};

【讨论】:

  • 它可能不起作用,因为不能保证b 正确对齐。
  • @LưuVĩnhPhúc 是的,但我认为关键是要解释为什么它在起作用时起作用。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多