标准中不保证 ifptr是空指针,那么(uintptr_t)ptris 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。在大多数实现(包括所有“现代”实现)中,最后两件事恰好是真的。