繁体   English   中英

在C中类推NULL指针

[英]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)ptr0

如果你不关心空指针和零整数不相等的系统,那么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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM