2016-10-10 72 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;