c - 有效指针的可能值是多少?
问题描述
标准是否限制可能的内存地址(我会将其解释为指针的可能值)?您的代码是否可以依赖某些从未使用过的值并且仍然可以完全移植?
我刚刚在我们的代码库(它是一个 C 库)中看到了这一点,我想知道它是否总是可以的。我不确定作者的意思是什么,但这显然不仅仅是检查可能的空值。
int LOG(const char* func, const char* file,
int lineno, severity level, const char* msg)
{
const unsigned long u_func = (unsigned long)func;
const unsigned long u_file = (unsigned long)file;
const unsigned long u_msg = (unsigned long)msg;
if(u_func < 0x400 || u_file < 0x400 || u_msg < 0x400 ||
(unsigned)lineno > 10000 || (unsigned)level > LOG_DEBUG)
{
fprintf(stderr, "log function called with bad args");
return -1;
}
//...
}
另一个可能的用例是将布尔标志存储在指针中,而不是存储在单独的成员变量中作为优化。我认为 C++11 小字符串优化可以做到这一点,但我可能错了。
编辑:
如果它是定义的实现,正如你们中的一些人提到的,你能在编译时检测到它吗?
解决方案
标准是否限制可能的内存地址(我会将其解释为指针的可能值)?
C++(据我所知也不是 C)标准不限制可能的内存地址。
您的代码是否可以依赖某些从未使用过的值并且仍然可以完全移植?
无条件地依赖于定义(或标准未指定)细节的这种实现的程序将不能完全移植到所有具体和理论的标准实现。
但是,使用平台检测宏,可以通过仅在细节可靠的系统上有条件地依赖细节来使程序可移植。
PS您在技术上不能依赖的另一件事:unsigned long
不能保证能够表示所有指针值(uintptr_t
is)。
推荐阅读
- c# - 接口变体返回类型
- python - Python3 UnboundLocalError:赋值前引用的局部变量
- testng - 与 TestNG 依赖项冲突并有条件地跳过测试
- javascript - Disqus 评论在 Gatsby 网站中引发错误
- regex - 如何使正则表达式同时匹配前缀和多个后缀?
- android - 在 Oppo 中将语音转换为文本时出现录音和客户端错误
- keycloak - 我们可以在 Quarkus 中混合使用 OIDC 身份验证和基本身份验证吗?
- python - 从 python 中查找或选择元素以使用 beautifulsoup 进行抓取
- postgresql - EFCore 迁移是否会锁定整个架构?
- node.js - 如何将从 ipcRenderer 接收到的值分配给另一个脚本中的单独变量?