标准中不保证 ifptr
是空指针,那么(uintptr_t)ptr
is 0
。
如果您不关心空指针和零整数不等价的系统,那info.init = 0;
很好。
该init
成员具有整数类型,不能“设为空”。您可以分配0
给它,也可以将空指针转换为的结果分配给它uintptr_t
。在几乎所有的 C 实现中,这些都是相同的。但这并不能保证,并且在某些系统上它是不一样的。
NULL
可能是空指针,也可能是整数常量0
。在后一种情况下,标准中有一个保证,(uintptr_t)(NULL)
即0
. 因此,可能存在info.init = NULL; (void*)(info.init);
未定义行为的实现。如果 null 的整数等效值不为 0,则不会导致 null 指针,并且计算无效指针值是 UB。
因此,如果您想保证info
在转换为指针类型时会产生空指针,那么为了真正的可移植性,您应该这样做info.init = (uintptr_t)(void*)(NULL);
。uintptr_t
您可以选择通过包含将要转换为的指针类型而不是void*
. 存储 a 的充分理由很少uintptr_t
,因此提示正在发生的事情可能会对读者有所帮助。
请注意,标准中保证转换为指针类型的零值常量表达式是空指针。这并不意味着转换为指针类型的零值非常量表达式是空指针。这也不意味着转换为整数类型的空指针为 0。在大多数实现(包括所有“现代”实现)中,最后两件事恰好是真的。