gpt4 book ai didi

c++ - 关于指针取消引用的 C/C++ 问题

转载 作者:行者123 更新时间:2023-11-30 21:44:12 24 4
gpt4 key购买 nike

代码:

#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 时,它给出了垃圾值?

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

最佳答案

b contains the address of a, then while de-referencing b, it gives junk values ?

首先,您使用狡猾的强制转换来指向 float,但假装您指向不同的类型 int

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

然后,您将这个狡猾的 int 值作为与 %f 说明符匹配的 printf 参数传递,该说明符需要 double。这会带来更多未定义的行为;最有可能的是,它会将一些随机内存解释为 double 值,从而给出完整的垃圾。

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

I got the same issue while derived class pointer pointing to base class object.

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

也许,如果您针对这种情况提出了更具体的问题,解释了为什么您认为需要狡猾的强制转换,我们可以建议您如何在类型系统中实现您想要的目标。

关于c++ - 关于指针取消引用的 C/C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18630028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com