2016-10-10 73 views
1

在下面的代碼,浮動值澆鑄到char

#include<stdio.h> 
int main(){ 
    char array[] = {'1', 2, 5.2}; 
    char* my_pointer = array[2]; 
    printf("%c", *my_pointer); 
} 

5.2被存儲在IEEE 754表示在存儲器中,char緯紗8個比特(第一個)從該浮點表示,由於小端格式。

C是一種鬆散類型的語言。我被允許投下floatchar

爲什麼該程序是核心轉儲?

+0

這是個問題? – meJustAndrew

+4

做一些未定義的行爲,期待未定義的行爲發生。 –

+0

@DavidHoelzer我知道,如何在內存中存儲'5.2',我從中選擇了8位。那是不確定的? C是鬆散類型的語言。我被允許將'float'強制轉換爲'char'。爲什麼應該可執行的核心? – overexchange

回答

1

在您的程序中更改char *my_pointer = array[2];char *my_pointer = &array[2];作爲指針應存儲的地址。

#include<stdio.h> 
int main(){ 
    char array[] = {'1', 2, 45.2}; 
    char *my_pointer = &array[2]; 
    printf("%c", *my_pointer); 
} 

輸出:

- //NOTE: asci value of - is 45 

@AnT在評論中提到,當您轉換45.2char類型,編譯器會生成一個加載45.2代碼,截斷的值,並將其存儲您的char變量爲45,所以當你打印時你得到-作爲輸出。

+0

如果我在數組中有多個數據類型,您是否有任何問題?正如我們所說的數組是同質datamodel – overexchange

+0

說實話@overchange我不知道,因爲我從來沒有經常使用數組。我堅持定義的行爲。你最好問別人:) – Cherubim

+0

「數組是同質數據模型」這是什麼意思?在C中,數組的類型是您定義的。 –

1
char* my_pointer = array[2]; 

是錯誤的。該類型的RHS類型爲char,而不是char*。調高編譯器中的警告級別可以幫助您識別這些問題。

隨着gcc -Wall,我得到以下警告:

soc.c: In function ‘main’: 
soc.c:4:23: warning: initialization makes pointer from integer without a cast 
    char* my_pointer = array[2]; 

之後,該計劃已未定義行爲。

你需要的是:

char* my_pointer = &array[2]; 

char* my_pointer = array + 2;