【问题标题】:C programming - unexpected outputC 编程 - 意外输出
【发布时间】:2018-09-02 16:13:35
【问题描述】:

我无法理解以下代码的工作原理:

#include<stdio.h>

int main() {

 int i = 100;
 int *a = &i;
 float *f = (float *)a;

 (*f)++;

 printf("%d", *a); //getting some garbage value

}

'f' 指向与'a' 相同的内存位置。所以,(*f)++ 应该反过来将 i 的值增加到 101。我哪里出错了?

【问题讨论】:

  • 这个程序的行为很大程度上取决于floats 在内存中的表示方式(很可能根据 IEEE 754)。
  • 首先,正式的回答是你所做的是违反严格的别名规则(也就是说,在f的位置没有float指向,所以访问*f是非法的)。因此,您的程序的行为是不受约束的,它可以做任何事情。

标签: c casting output


【解决方案1】:

浮点数和整数以不同的二进制表示形式存储。当您将 float 转换为 int 或反之亦然时,编译器会为您处理这些问题。但在您的情况下,您将int* 转换为float*,因此您正在修改具有错误值的浮点数,因为二进制表示没有被转换。

【讨论】:

  • 谢谢,一个小问题,如果我把float *f = (float *)a;换成char *f = (char *)a;,那么输出是101。为什么在这种情况下没有任何问题?
  • 因为char基本上只是int的一个子集并且存储方式相同,但float完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2016-03-11
  • 2021-10-13
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多