2015-05-24 27 views
-2

有谁知道这是如何工作的?C程序打印神秘的字。这是如何发生的?

C程序来源:

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

    return 0; 
} 

输出:

Fell 

为什么会这样的程序显示 “打倒”?

+2

浮子'1.143139e + 27' = hex'46656C6C' = ascii'Fell' –

+2

使用实现定义的方面可能会导致未定义的行为r ...这个问题是无效的。 – Sebivor

+1

未定义的行为。没有人知道字符串在这4个字节后停止的时间 –

回答

6

它与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};

+1

它可能不起作用,因为不能保证“b”被适当对齐。 –

+0

@LưuVĩnhPhúc是真实的,但我认为重点是解释为什么它在它的工作时起作用。 –