-7

代码:

#include <stdio.h>
int main()
{
  float a = 12.01;
  int *b = (int *)&a;
  printf("%p\n%p\n%f\n",&a,b,*b);
  return 0; 
}

b包含 的地址a,然后在取消引用b时,它会给出垃圾值?

请回答,派生类指针指向基类对象时,我遇到了同样的问题。

4

2 回答 2

2

b包含 的地址a,然后在取消引用b时,它会给出垃圾值?

首先,您使用狡猾的演员来指向 afloat但假装您指向的是不同的 type int

然后你读取值,给出未定义的行为;通常,如果两种类型的大小相同,您将获得表示浮点数的位模式,这看起来像垃圾。

然后你将那个狡猾int的值作为与指定符printf匹配的参数传递%f,它期望double. 这会产生更多未定义的行为;最有可能的是,它会将一些随机内存解释为一个double值,从而产生完全的垃圾。

如果要检索预期的浮点值,则需要转换回正确的类型:*(float*)b. 如果要将转换为int,则将其转换为,而不是指针:int b = (int)a;。这里的强制转换不是绝对必要的,但一些编译器可能会发出警告,暗示隐式转换会丢失信息。

当派生类指针指向基类对象时,我遇到了同样的问题。

这是一个不同但相关的问题。同样,您在指针指向的类型上撒谎,如果您尝试使用该指针访问错误的对象类型,您将获得未定义的行为。

也许如果您就这种情况提出一个更具体的问题,解释为什么您认为您需要狡猾的演员表,我们可以建议您如何在类型系统中实现您想要的。

于 2013-09-05T07:24:59.610 回答
-1

尝试这个 ...

#include <stdio.h>

int main()
{
 float a = 12.01;
 void *b = (int *)&a;
 printf("%p\n%p\n%f\n",&a,b,*(float *)b);
 return 0; 
}
于 2013-09-05T07:35:39.827 回答