2015-05-24 30 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是真實的,但我認爲重點是解釋爲什麼它在它的工作時起作用。 –