首页 > 解决方案 > 有效指针的可能值是多少?

问题描述

标准是否限制可能的内存地址(我会将其解释为指针的可能值)?您的代码是否可以依赖某些从未使用过的值并且仍然可以完全移植?

我刚刚在我们的代码库(它是一个 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++(据我所知也不是 C)标准不限制可能的内存地址。

您的代码是否可以依赖某些从未使用过的值并且仍然可以完全移植?

无条件地依赖于定义(或标准未指定)细节的这种实现的程序将不能完全移植到所有具体和理论的标准实现。

但是,使用平台检测宏,可以通过仅在细节可靠的系统上有条件地依赖细节来使程序可移植。


PS您在技术上不能依赖的另一件事:unsigned long不能保证能够表示所有指针值(uintptr_tis)。


推荐阅读