C编程-意外输出
我无法理解以下代码是如何工作的:C编程-意外输出,c,casting,output,C,Casting,Output,我无法理解以下代码是如何工作的: #include<stdio.h> int main() { int i = 100; int *a = &i; float *f = (float *)a; (*f)++; printf("%d", *a); //getting some garbage value } #包括 int main(){ int i=100; int*a=&i; 浮点数*f=(浮点数*)a; (*f)++; printf(“%d”,*a)
#include<stdio.h>
int main() {
int i = 100;
int *a = &i;
float *f = (float *)a;
(*f)++;
printf("%d", *a); //getting some garbage value
}
#包括
int main(){
int i=100;
int*a=&i;
浮点数*f=(浮点数*)a;
(*f)++;
printf(“%d”,*a);//获取一些垃圾值
}
“f”指向与“a”相同的内存位置。因此,
(*f)+
应该依次将i的值增加到101。哪里出错了?浮点和整数以不同的二进制表示形式存储。当您将float
转换为int
或反之亦然时,编译器会为您处理此问题。但是在您的例子中,您正在将int*
强制转换为float*
,因此您正在修改一个具有错误值的float,因为二进制表示没有转换。此程序的行为在很大程度上取决于float
在内存中的表示方式(很可能是根据IEEE 754)。首先,正式答案是,您所做的违反了严格的别名规则(即,f
指向的位置中没有float
,因此访问*f
是非法的)。因此,您的程序的边界是未定义的,它可以做任何事情代码>带有char*f=(char*)a代码>,则输出为101。为什么在这种情况下没有出现任何问题?因为char
基本上只是int
的一个子集,并且以相同的方式存储,但是float
是完全不同的。