我知道一种类型的指针可以转换为另一种类型的指针,例如,当使用malloc时,void指针可以转换为另一种类型。但我见过这段代码,它将一个值直接转换为指针类型。你能帮我了解一下这是怎么回事吗?
#include <stdio.h>
#include <stdlib.h>
enum otype {INT, SYM, CONS};
typedef struct obj {
enum otype type;
struct obj *p[1];
} obj;
int
main(void)
{
struct obj *o1 = (obj *) 10;
printf("%d\n", (int) o1);
struct obj *o2 = (obj *) "abc";
printf("%s\n", (char *) o2);
return 0;
}发布于 2016-05-26 19:48:07
您可以自由地将任何指针类型以及一些非指针类型转换为任何其他指针类型。这并不意味着结果有任何有用的意义。
指针只是一个整数,它包含某段数据的内存地址。当您将它从一种类型转换为另一种类型时,实际上是在告诉编译器相同的数字(内存地址)引用不同的类型。根据源和目标类型的不同,结果可能从有用到完全和完全没有意义。
以你的例子为例:
struct obj *o1 = (obj *) 10;这告诉编译器将内存地址10 (0xa)视为包含类型为obj的结构。因为存储器地址10很可能不包含该指针,所以试图实际取消引用该指针将导致未定义行为。
struct obj *o2 = (obj *) "abc";在这里,我们有更坚实的理由(不是很多)。这是因为,即使我们不知道o2获得的地址是什么,我们也知道内存中有什么。该内存包含序列0x61 0x62 0x63 0x00。假设有一台小的Endian机器(现在大多数都是),这意味着您的枚举包含(无效)值6513249,并且您的指针和第一种情况一样是未定义的。
https://stackoverflow.com/questions/37459827
复制相似问题