gpt4 book ai didi

c - 假设 NULL 常量为零是否安全?

转载 作者:行者123 更新时间:2023-12-03 18:20:50 24 4
gpt4 key购买 nike

理解和使用 C 指针 , by Richard Reese 说:

The null concept is an abstraction supported by the null pointer constant. This constant may or may not be a constant zero. A C programmer need not be concerned with their actual internal representation.



我的问题是,由于“这个常数可能是也可能不是常数零”,我在我的代码中执行以下操作是否安全:
int *ptr = NULL;
// Some code which probably sets ptr to a valid memory address

if(!ptr)
{
ERROR();
}

如果 NULL 不为 0,则 if 子句有可能评估为真。

最佳答案

Is it safe to assume that the NULL constant is zero?

NULL将比较等于 0 . NULL是非常常见的零位模式。 NULL 是可能的成为非零位模式 - 但这些天没有看到。

OP 混合了至少 4 件事: NULL ,空指针常量,空指针,将空指针与0进行比较。C没有定义NULL常量。
NULL

NULL is a macro "which expands to an implementation-defined nullpointer constant" C17dr § 7.19 3


空指针常量

An integer constant expression with the value 0, or such an expressioncast to type void *, is called a null pointer constant. C17dr § §6.3.2.3 3


因此,空指针常量的类型可能是 int , unsigned , long , ... 或 void * .
当一个整型常量表达式1时,空指针常量值为0。作为指针像 ((void *)0) ,其值/编码未指定。它无处不在地具有零的位模式,但并未如此指定。
可能有很多空指针常量。它们都比较相等。
注意:空指针常量的大小,当它是一个整数时,可能与对象指针的大小不同。通常通过附加 L 来避免这种大小差异。或根据需要添加两个后缀。
空指针

If a null pointer constant is converted to a pointer type, theresulting pointer, called a null pointer, is guaranteed to compareunequal to a pointer to any object or function. C17dr § § 6.3.2.3 3

Conversion of a null pointer to another pointer type yields a nullpointer of that type. Any two null pointers shall compare equal. C17dr§ § 6.3.2.3 4


空指针的类型是一些指针,或者是像 int *, char * 这样的对象指针。或函数指针,如 int (*)(int, int)void * .
未指定空指针的值。它无处不在地具有零的位模式,但并未如此指定。
无论编码如何,所有空指针都比较相等。
将空指针与 0 进行比较 if(!ptr)if(!(ptr != 0)) 相同.当指针 ptr ,即空指针,与0比较,零转换为指针,同类型的空指针: int * .这 2 个空指针可能具有不同的位模式,比较相等。

那么什么时候假设 NULL 常量为零是不安全的呢? NULL可能是 ((void*)0)并且其位模式可能与零不同。无论其编码如何,它确实比较等于 0 如上所述。回想指针比较已经讨论过,而不是整数比较。转换 NULL即使 ((void*)0) 为整数也可能不会导致整数值为 0都是零位。
printf("%ju\n", (uintmax_t)(uintptr_t)NULL); // Possible not 0
请注意,这是将指针转换为整数,而不是 if(!ptr) 的情况。其中 0 被转换为指针。
C 规范包含许多旧的做事方式,并且对新颖的新方式持开放态度。我从未遇到过 NULL 的实现不是全零位模式。鉴于存在许多假设 NULL 的代码都是零位,我怀疑只有旧的晦涩实现才使用过非零位模式 NULL还有那个 NULL几乎可以肯定是全零位模式。

1 空指针常量是 1) 整数或 2) void* . “当一个整数......”指的是第一种情况,而不是第二种情况的强制转换或转换,如 (int)((void*)0) .

关于c - 假设 NULL 常量为零是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60768339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com