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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:20:27