C语言字符串比较疑问:指针与字面量相等判断为何为真?
C语言字符串比较的三个判断逻辑解析
代码示例
#include <stdio.h> #include <string.h> int main() { printf("Hello World\n"); char *x; char *w = "oliver bier"; char *w2 = "oliver bier"; x = w; if(x == "oliver bier") { // 此处比较的是什么?为何条件为真 printf("This is comparing string also????\n"); printf("Or this is comparing the type of the variable x and type of oliver bier i.e. a string??"); } if ( strcmp( x, w2) == 0 ) { // 我了解这才是比较字符串的正确方式 printf("I think this is the correct way to compare two strings\n"); } if(x == w) { // 此处比较的是什么? printf("This is expected!! since x, w stored same address"); } return 0; }
1. if(x == "oliver bier"):指针地址的比较,而非字符串内容
这行代码本质是比较两个指针的内存地址,不是字符串的内容。
原因在于C语言的编译器优化:程序中所有内容完全相同的字符串字面量,通常会被编译器存到内存的同一个只读区域里,复用同一块空间。
- 代码里
w被赋值为"oliver bier"的地址,x又等于w,所以x指向的就是这个字符串的内存地址。 - 当你写
x == "oliver bier"时,右边的字符串字面量会被转换成指向它的指针,而这个地址和x的地址完全一致,所以条件为真。
注意:这种字符串复用是编译器的优化行为,不是C语言标准强制要求的——换个编译器或者关闭优化后,这个条件可能就不成立了。
2. if(strcmp(x, w2) == 0):字符串内容的标准比较
strcmp()是C标准库专门用来对比字符串内容的函数:
- 它会逐字符对比两个字符串的ASCII值,直到遇到不同字符或结束符
\0。 - 返回值为0时,代表两个字符串内容完全相同;返回正/负数则表示内容的大小差异。
这确实是比较字符串内容的可靠方式,不受编译器优化的影响。
3. if(x == w):指针地址的直接对比
这行是直接比较指针变量x和w存储的内存地址:
- 代码里
x = w已经把w的地址(也就是"oliver bier"的地址)赋值给了x,所以两个指针指向同一块内存,条件必然为真。
内容的提问来源于stack exchange,提问作者hodondo
相关产品推荐
相关产品推荐

