[英]Typecasting NULL pointer in C
我有一个结构
struct detail {
int id;
uintptr_t init;
// blah blah
};
struct detail info;
info.id = 1;
info.init = (uintptr_t)NULL;
我必须使init
成员为NULL。 如果我强制转换(或不转发) NULL
可能/可能不会发生什么? 如果我直接将它指定为NULL,如info.init = NULL;
该info.init = NULL;
它是否与运行时错误有任何区别。 它汇编得很好。 但是代码的执行是我主要关注的问题。
谢谢
标准中无法保证如果ptr
是空指针,则(uintptr_t)ptr
为0
。
如果你不关心空指针和零整数不相等的系统,那么info.init = 0;
很好。
init
成员具有整数类型,不能为“null”。 您可以为其指定0
,或者可以为其分配将空指针转换为uintptr_t
。 在几乎所有的C实现中,这些都是一样的。 但它并不能保证,并且有一些系统与它不一样。
NULL
可能是空指针,也可能是整数常量0
。 在后一种情况下, 存在在标准中,一个保证(uintptr_t)(NULL)
是0
。 所以可以有info.init = NULL; (void*)(info.init);
info.init = NULL; (void*)(info.init);
有未定义的行为。 如果null的整数等值不为0,则不会产生空指针,并且计算无效指针值是UB。
所以,如果你想保证info
,当转换为指针类型时,会产生一个空指针然后为了真正的可移植性你应该做info.init = (uintptr_t)(void*)(NULL);
。 您可以通过包含uintptr_t
将要转换为的指针类型而不是void*
来为读者提供额外的线索。 存储uintptr_t
原因很少,因此暗示正在发生的事情可能有助于读者。
请注意,标准中保证转换为指针类型的零值常量表达式是空指针。 这并不意味着零值非恒定表达,转换为指针类型,是空指针。 它也不意味着转换为整数类型的空指针为0.最后两件事在大多数实现中都是正确的(包括所有“现代”的)。
NULL是一个内置常量,其值与系统上的空指针无关。 将常量值分配给与系统上的指针相同大小(或更大)的int是完全有效的。
我会在这里投票,因为通常不允许指定整数指针并且会产生警告。 当然,使用intptr_t
是一个非常好的主意,因为它足够大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.