You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C23中nullptr的内存表示:用memcmp验证是否可靠?

验证nullptr与void*空指针的位模式是否一致

你的代码能在绝大多数主流平台和编译器下验证文档里提到的特性,但从C++标准的严谨性来说,它的验证逻辑有需要注意的地方:

核心结论

  1. 实际场景下几乎都能得到预期结果:在GCC、Clang、MSVC等主流编译器,以及x86、ARM等常见平台上,空指针的位模式都是全0,所以memcmp会返回0,输出位模式相同的结果。
  2. 标准层面的细节:n3042里提到的是nullptr的位模式与void*空指针常量相同,但C++标准并没有强制要求空指针的位模式必须是全0——只是几乎所有实现都这么做。不过当你把NULL(通常定义为0或0L)和nullptr都赋值给void*变量后,这两个变量都会成为有效的空指针,而同一平台上的空指针位模式是统一的,所以即使不是全0,memcmp结果也会相等。

更符合标准语义的验证方式

其实不需要用memcmp来比较位模式,直接比较指针变量本身就足够了——C++标准明确规定,所有空指针之间的比较结果都是相等的,这比位模式比较更贴合空指针的语义:

#include <cstdio>

int main() {
    void* null_ptr1 = NULL;    
    void* null_ptr2 = nullptr;   

    if (null_ptr1 == null_ptr2) 
        printf("NULL和nullptr表示相同的空指针。\n");
    else 
        printf("NULL和nullptr表示不同的空指针。\n");
    
    // 位模式比较作为补充验证(可选)
    if (memcmp(&null_ptr1, &null_ptr2, sizeof(void*)) == 0) 
        printf("NULL和nullptr的二进制表示相同。\n");
    else 
        printf("NULL和nullptr的二进制表示不同。\n");
    return 0;
}

额外说明

如果你只是想确认nullptr赋值给void*后和NULL赋值的结果一致,直接用指针相等比较就完全足够;memcmp的方式更多是验证平台的空指针存储实现,而非标准规定的特性。

内容的提问来源于stack exchange,提问作者xdevel2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:55:01