Cap*_*orn 5 c windows null struct
我有一个结构
struct detail {
int id;
uintptr_t init;
// blah blah
};
struct detail info;
info.id = 1;
info.init = (uintptr_t)NULL;
Run Code Online (Sandbox Code Playgroud)
我必须使该init成员为NULL.如果我进行类型转换(或不进行类型转换)可能会/可能不会发生NULL什么?如果我直接将其分配为NULL,如果它对info.init = NULL;运行时错误有任何不同,该怎么办?它汇编很好.但是代码的执行是我主要关注的问题.
谢谢
标准中无法保证if ptr是否为空指针,(uintptr_t)ptr则为0.
如果你不关心空指针和零整数不相等的系统,那就没问题了info.init = 0;.
该init成员具有整数类型,不能"为空".您可以为其分配0,也可以为其分配将空指针转换为的结果uintptr_t.在几乎所有的C实现中,这些都是一样的.但它并不能保证,并且有一些系统与它不一样.
NULL可能是空指针,也可能是整数常量0.在后一种情况下,是在标准的保证(uintptr_t)(NULL)是0.因此,可能存在info.init = NULL; (void*)(info.init);具有未定义行为的实现.如果null的整数等值不为0,则不会产生空指针,并且计算无效指针值是UB.
所以,如果你想保证info,当转换为指针类型时,会产生一个空指针,然后你应该做真正的可移植性info.init = (uintptr_t)(void*)(NULL);.您可以选择通过包含uintptr_t将要转换为的指针类型来为读者提供额外的线索,而不是void*.存储一个很好的理由uintptr_t,所以提示正在发生的事情可能有助于读者.
请注意,标准中保证转换为指针类型的零值常量表达式是空指针.这并不意味着零值非恒定表达,转换为指针类型,是空指针.它也不意味着转换为整数类型的空指针为0.最后两件事在大多数实现中都是正确的(包括所有"现代"的).