首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >所有的指针都保证往返通过无效*正确吗?

所有的指针都保证往返通过无效*正确吗?
EN

Stack Overflow用户
提问于 2017-02-17 01:27:53
回答 1查看 93关注 0票数 2

在C语言中,是否保证任何指针类型都能成功地往返于void *中?

也就是说,下面这样的内容可以保证工作:

代码语言:javascript
运行
复制
typedef struct {
...
} A;

A *p = ...;
void *v = p;
A *p2 = v;
// use p2 here

不管是什么类型的A

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-17 01:31:30

对象指针确实可以通过void*往返。C11 6.3.2.3第1段:

指向空的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针可以再次转换为无效指针和返回指针;结果应与原始指针相比较。

请注意,相反的方向是不正确的,当您将一个空指针转换为某个对象指针并返回时,您不会得到与您开始时相同的值。

还请注意,函数指针不是这样的;但是,所有函数指针类型都是相互往返的:第8段说:

指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再转换回来;结果应该与原始指针相比较。

此外,在第7段中,对象指针在不涉及空指针的情况下也是可往返的(不涉及空指针),但有一些限制:

指向对象类型的指针可以转换为指向不同对象类型的指针。如果引用类型的结果指针未正确对齐),则行为未定义。否则,当再次转换回时,结果将与原始指针进行比较。

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

https://stackoverflow.com/questions/42287803

复制
相关文章

相似问题

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