【问题标题】:Are all pointers guaranteed to round-trip through void * correctly?是否保证所有指针都能正确地通过 void * 往返?
【发布时间】:2017-02-17 01:27:53
【问题描述】:

在 C 语言中,是否保证任何指针类型都可以成功往返 void *

也就是说,以下内容保证可以工作:

typedef struct {
...
} A;

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

不管A是什么类型的?

【问题讨论】:

  • 只有对象指针。不是函数指针。
  • 是的,不要将函数强制转换为void *,您应该将其包装在结构中,

标签: c pointers language-lawyer void-pointers


【解决方案1】:

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

指向 void 的指针可以转换为或从指向任何对象类型的指针转​​换。指向的指针 任何对象类型都可以转换为指向 void 并再次返回的指针;结果应 比较等于原始指针。

请注意,相反的方向是不正确的,当您将 void 指针转换为某个对象指针并返回时,您不能保证与开始时的值相同。

还要注意,函数指针不是正确的;但是,所有函数指针类型都可以相互往返:第 8 段说:

指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针 键入并再次返回;结果应与原始指针比较。

此外,对象指针之间也是可往返的(不涉及 void 指针),受第 7 段限制:

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

【讨论】:

  • 建议详细说明通过void* 的往返会产生一个等效的指针,但不一定是 same 位模式指针。 IAC,看起来 OP 只对等效访问感兴趣。
  • 指向任何类型的指针都可以转换为任何其他类型并返回,只要不违反对齐方式,它将与原始指针进行比较。
  • @2501:需要引用。
  • 阅读第 7 段。
  • @2501: 是的,确实。
猜你喜欢
  • 2012-09-27
  • 2015-10-03
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2014-10-25
  • 1970-01-01
相关资源
最近更新 更多