gpt4 book ai didi

c - NULL 数据指针与 NULL 函数指针相同吗?

转载 作者:行者123 更新时间:2023-12-02 01:51:32 25 4
gpt4 key购买 nike

POSIX 要求(我认为)函数指针可以存储在 void* 类型的变量中和/或传递给需要 void* 参数的函数,即使这是严格非标准的。

我的问题是这样的:如果我测试这样一个变量/参数的 NULL-ness,if (!(variable or argument)) 说,结果是true,这是否一定意味着函数指针NULL? NULL void* 数据指针的位模式是否可以等同于非 NULL 函数指针值?任何理智的实现会这样做吗?有没有常见的实现可以做到这一点?

编辑:this answer (诚​​然,对于另一个问题)让我想知道我是否必须将 void* 中间体转换回原始函数指针类型,然后才能测试 NULL 性,否则它就是 UB...是真的吗?那些发布答案的人可以对这个问题发表意见吗?

最佳答案

C 2018 6.3.2.3 4 说:

Conversion of a null pointer to another pointer type yields a null pointer of that type. Any two null pointers shall compare equal.

本段与第 7 段不同,不限制对象类型指针或函数类型指针的转换。因此,如果某个函数指针类型的空指针转换为 void *,则结果是一个空指针,然后对其应用 ! 将产生 1。

相反,如果将 ! 应用于指针会产生 1,那么它必然是由空指针产生的,这会更加困难。我们可以想象一些非空函数指针,当转换为void *时,会产生一个空指针。考虑到 POSIX 允许函数指针临时存储在 void * 中的意图,我们可以得出结论,将函数指针转换为 void * 永远不会导致 null指针。

Could the bit pattern for a NULL void* data-pointer ever equate to a non-NULL function-pointer value?

C 标准不讨论用于表示指针的位模式。语义是根据值建立的。

Would any sane implementation do this?

当然,某些硬件上的裸机引导代码可能会将可执行指令放在地址零处,并出于某种原因调用那里的函数,并且还可能使用地址零作为空指针。它将简单地设计为不依赖于未测试是否为空指针的地址零处的函数。

除了这种特殊情况外,即出于所有实际目的,不会这样做。如果某些软件决定需要空指针的特殊表示,它将为此留出一些地址,并且不会将该地址用于任何普通函数或对象。

关于c - NULL 数据指针与 NULL 函数指针相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70274727/

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