C/C++ 指针取消引用的问题
C/C++ problems on pointer de-referencing
代码:
#include <stdio.h>
int main()
{
float a = 12.01;
int *b = (int *)&a;
printf("%pn%pn%fn",&a,b,*b);
return 0;
}
b
包含a
的地址,那么在取消引用b
时,给出垃圾值?
请回答,当派生类指针指向基类对象时,我遇到了同样的问题。
b
包含a
的地址,那么在取消引用b
时,给出垃圾值?
首先,你使用一个狡猾的演员表指向一个float
但假装你指向一个不同类型的int
。
然后你读取值,给出未定义的行为;通常,如果两种类型的大小相同,你会得到表示浮点数的位模式,它看起来像垃圾。
然后,您将该狡猾的int
值作为与%f
说明符匹配的printf
参数传递,该说明符期望double
。这给出了更多未定义的行为;最有可能的是,它会将一些随机内存解释为double
值,从而产生完全的垃圾。
如果要检索预期的浮点值,则需要转换回正确的类型:*(float*)b
。如果要将值转换为 int
,请转换它,而不是指针:int b = (int)a;
。此处的强制转换不是绝对必要的,但某些编译器可能会发出隐式转换丢失信息的警告。
当派生类指针指向基类对象时,我遇到了同样的问题。
这是一个不同但相关的问题。同样,你在指针指向什么类型上撒谎,如果你尝试使用该指针访问错误的对象类型,你将得到未定义的行为。
也许如果你问了一个关于这种情况的更具体的问题,解释为什么你认为你需要狡猾的演员阵容,我们可以建议你如何在类型系统中实现你想要的东西。
试试这个...
#include <stdio.h>
int main()
{
float a = 12.01;
void *b = (int *)&a;
printf("%pn%pn%fn",&a,b,*(float *)b);
return 0;
}
相关文章:
- C++ - 对 PCM::getInstance() 的未定义引用问题
- 通过键入的引用问题传递函数
- printf(时差程序)中的引用问题
- 在一个简单的程序中奇怪的通过引用问题传递
- 在实现OpenSceneGraph时在Qt中获取引用问题
- antlr4 c++目标的未定义引用问题
- 基本指针/引用问题
- 通过引用问题传递C++
- C++ OpenMP 任务 - 通过引用问题传递
- C/C++ 双指针取消引用问题
- Q字符串传递引用问题
- Q_OBJECT导致"未定义对v_table引用"问题
- 具有最小"extern"使用测试用例的未定义引用问题
- 下标操作符重载:返回引用问题
- LuaJIT FFI中的指针和引用问题
- c++和Netbeans的未定义引用问题
- 指针和引用问题
- void*指针中的引用问题
- Crypto++ Code::blocks未定义引用问题
- 使用 FFTW 的"未定义引用"问题