首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针类型转换

指针类型转换
EN

Stack Overflow用户
提问于 2016-05-26 19:39:11
回答 1查看 73关注 0票数 1

我知道一种类型的指针可以转换为另一种类型的指针,例如,当使用malloc时,void指针可以转换为另一种类型。但我见过这段代码,它将一个值直接转换为指针类型。你能帮我了解一下这是怎么回事吗?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-05-26 19:48:07

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

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

以你的例子为例:

代码语言:javascript
复制
struct obj *o1 = (obj *) 10;

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

代码语言:javascript
复制
struct obj *o2 = (obj *) "abc";

在这里,我们有更坚实的理由(不是很多)。这是因为,即使我们不知道o2获得的地址是什么,我们也知道内存中有什么。该内存包含序列0x61 0x62 0x63 0x00。假设有一台小的Endian机器(现在大多数都是),这意味着您的枚举包含(无效)值6513249,并且您的指针和第一种情况一样是未定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37459827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档