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
相关产品推荐
相关产品推荐

