指针式铸造

时间:2016-05-26 11:39:11

标签: c pointers

我知道一种类型的指针可以被转换为另一种类型的指针,例如当使用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;
}

1 个答案:

答案 0 :(得分:0)

您可以将任何指针类型以及一些非指针类型自由地转换为任何其他指针。这并不意味着结果有任何有用的意义。

指针只是一个整数,包含某些数据的内存地址。当你将它从一种类型转换为另一种类型时,你实际在做的是告诉编译器相同的数字(内存地址)是指不同的类型。根据源和目的地类型,结果可能从有用到完全无意义。

举个例子:

struct obj *o1 = (obj *) 10;

这告诉编译器将内存地址10(0xa)视为包含obj类型的结构。由于内存地址10很可能不包含该内容,因此尝试实际取消引用该指针将导致未定义的行为。

struct obj *o2 = (obj *) "abc";

这里我们的地面稍微坚固(不多)。这是因为,即使我们不知道o2得到的地址是什么,我们也知道该记忆中的内容。该内存包含序列0x61 0x62 0x63 0x00。假设有一个小的Endian机器(其中大部分都是这些天),这意味着你的枚举包含(无效)值6513249,并且你的指针与第一种情况一样未定义。