繁体   English   中英

NULL 数据指针是否与 NULL 函数指针相同?

[英]Is NULL data-pointer the same as NULL function-pointer?

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

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

C11 草案标准建议,虽然不是核心标准的一部分,但将 function 指针转换为 object 指针(出于测试目的,如在您的NULL中)属于“类别”。5

J.5.7 Function 指针转换

1 指向 object 或void的指针可以转换为指向 function 的指针,从而允许将数据作为 function (6.4) 调用

2 指向 function 的指针可以转换为指向 object 或void的指针,从而允许调试器检查或修改 function(例如。54)

C 2018 6.3.2.3 4 说:

将 null 指针转换为另一种指针类型会产生该类型的 null 指针。 任何两个 null 指针应比较相等。

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

建立相反,如果应用! 一个指针产生 1,它必然来自一个 null 指针,它更难。 我们可以想象一些非空的 function 指针,当转换为void *时,会产生一个 null 指针。 考虑到 POSIX 允许 function 指针临时存储在void *中的意图,我们可以得出结论,将指向 function 的指针转换为void *绝不会导致 Z37A6259CC46C1DAE299A768 指针。

NULL void* 数据指针的位模式是否等同于非 NULL 函数指针值?

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

任何理智的实施都会这样做吗?

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

在这种特殊情况之外,即出于所有实际目的,不这样做。 如果某些软件决定它需要 null 指针的特殊表示,它将为此留出一些地址,而不是将该地址用于任何普通的 function 或 object。

如果实现的目标是一个平台,其中 null 代码指针的通用惯用位模式与 null 数据指针的通用惯用位模式不同,则可以自由地暴露指针与程序员不同的事实,或者将指针操作包装在一个抽象中,使它们的行为相同。 该标准的作者没有试图猜测哪种方法更有用,因为实际为相关平台编写代码的人比委员会更能判断每种方法的利弊。

在更常见的情况下,目标平台对两种 null 指针使用相同的表示,标准的作者会期望实现会以这种方式存储两种指针,但也会认为这样的想法实现应该表现得足够明显,以至于不需要花费墨水来推荐这种行为。

该标准未能强制执行常见行为并不意味着任何判断实现应该做任何其他事情,而只是承认实现可能存在于某些其他行为有时可能比常见行为更有用的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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