【发布时间】:2020-06-03 07:38:17
【问题描述】:
如果存在,则应满足以下性质:
- 类型为
void * - 不需要实例化“虚拟对象”来充当地址
- 保证不等于
NULL - 可以在不调用未定义行为的情况下构造
- 使用符合标准的编译器,无需非标准扩展
起初我以为我可以做(NULL + 1) 或(void *)1 之类的事情,但这些似乎有问题。前者在NULL 上使用指针算法,我认为这是未定义的行为。第二个依赖于NULL没有物理地址1的事实。(即(void *)0 == (void *)1完全有可能)
【问题讨论】:
-
不,在标准 C 中没有类似的东西。请问您为什么需要它?你试图用它解决什么问题?
-
@Stargateur 不是。是IDB
-
值得一提的是,Rust 的
dangling()相当于(void*)alignof(T)以确保指针正确对齐,同时尽可能靠近 0 地址。 -
@Stargateur 将整数转换为指针是实现定义的行为。自然地,因为地址映射是特定于实现的。但是,在具有虚拟地址空间的托管系统上这样做肯定是有问题的做法。在直接寻址物理内存的较低级别系统上,这完全没问题。
-
@Someprogrammerdude 我想减少结构的内存占用,因为我有很多存储在数组中。 Rust 能够压缩结构,因为知道
NonNull永远不能为空,因此Option<NonNull>或Option<SomeStructContainingNonNull>不需要额外的“标志字节”。基本上,想想 C 中的标记联合,但不需要标记。
标签: c pointers void-pointers dangling-pointer