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

const char*字面量""与"\0"是否相同?有无差异场景?

空字符串字面量""与"\0"的差异分析

两者是否完全相同?

答案是不完全相同。从内存存储的角度说:

  • 空字符串""在内存里只有一个由编译器自动添加的终止符\0,用strlen获取长度结果为0,sizeof计算占用内存为1字节。
  • 字符串"\0"是显式写了一个\0字符,编译器会额外再补一个终止用的\0,所以内存里是两个连续的\0,strlen结果同样为0,但sizeof计算结果为2字节。

存在const char*表现差异的场景?

当用const char*指向这两个字面量时,以下场景会体现出明显差异:

1. 字面量地址比较

多数编译器会对内容完全一致的字符串字面量做合并优化——让多个指向相同字面量的指针共用同一块内存,但""和"\0"的存储内容(字节数)不一样,因此指向它们的const char*地址通常不相等。示例代码:

#include <stdio.h>

int main() {
    const char* p_empty = "";
    const char* p_null = "\0";
    if (p_empty == p_null) {
        printf("地址相同\n");
    } else {
        printf("地址不同\n"); // 多数编译器会输出此结果
    }
    return 0;
}

2. 逐字节内存对比

strlen无法区分两者(都会在第一个\0处停止计数),但如果用memcmp在合法范围内比较内存内容,能发现差异。注意访问""的第二个字节属于未定义行为,以下仅作逻辑演示:

#include <stdio.h>
#include <string.h>

int main() {
    // 仅比较第一个字节的话结果相同,比较两个字节时会体现差异
    int cmp_result = memcmp("\0", "", 2);
    if (cmp_result != 0) {
        printf("内存内容存在差异\n");
    }
    return 0;
}

3. 直接对字面量用sizeof运算符

虽然const char*指针本身的大小是固定的(4或8字节,取决于平台),但直接对字符串字面量使用sizeof时,两者结果不同:

#include <stdio.h>

int main() {
    printf("sizeof(\"\") = %zu\n", sizeof("")); // 输出1
    printf("sizeof(\"\\0\") = %zu\n", sizeof("\0")); // 输出2
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:47