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

C语言中使用==比较字符串结果不符的原因解析

为什么用==比较C语言字符串会得到"unequal"而strcmp却能正确判断相等?

你猜的完全没错!问题根源就是str1和str2的内存地址不一样,而==在比较字符串的时候,根本不是在比内容,而是在比指针的地址。

先搞懂==比较字符串的本质

在C语言里,没有原生的"字符串"数据类型,我们平时用的字符串其实是字符数组或者指向字符的指针。当你用==比较str1和str2的时候:

  • 对于数组形式的char str1[] = "xxx",数组名str1会被隐式转换成指向数组第一个元素的指针(也就是数组的首地址)。
  • 所以str1 == str2实际在做的是:比较两个数组的首地址是否相同,而不是比较数组里的字符内容。

看你的代码具体情况

你的代码里:

#include<stdio.h>
int main() {
    char str1[] = "ComputerProgram";
    char str2[] = "ComputerProgram";
    (str1==str2)? (printf("Equal")):(printf("unequal"));
    return 0;
}

这是两个独立的字符数组,编译器会在栈上给它们分配两块完全不同的内存空间,然后把"ComputerProgram"这个字符串分别复制到这两块空间里。所以str1指向的是第一块内存的起始地址,str2指向第二块的起始地址——这两个地址肯定不一样,所以==判断的结果就是false,自然打印"unequal"。

那strcmp为什么能正确判断?

strcmp是标准库专门用来逐字符比较字符串内容的函数,它的工作逻辑是:

  1. 从两个字符串的首字符开始,逐个比较对应位置的字符ASCII值
  2. 如果遇到不同的字符,就返回两个字符的差值;如果一直到字符串末尾('\0')都完全相同,就返回0
    所以strcmp(str1, str2) == 0就表示两个字符串的内容完全相等,这才是判断字符串内容是否相同的正确方式。

补充一个容易混淆的情况

如果你写成指针形式的字符串常量:

char *str1 = "ComputerProgram";
char *str2 = "ComputerProgram";

这时候str1 == str2可能会返回true——因为很多编译器会做优化,把相同的字符串常量存到同一个内存区域,让两个指针指向同一个地址。但这种行为是编译器相关的,完全不可靠!哪怕看起来能工作,也绝对不能用==来判断字符串内容相等,必须用strcmp才是标准、可移植的写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:12