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

C语言中==运算符比较字符串的是字面量还是内存地址?代码疑问求解

在C语言中,==比较字符串:比的是地址,不是内容

咱们先把核心结论摆出来:在C语言里,用==运算符比较字符串相关的变量时,本质是比较它们的内存地址,而非字符串的字面量内容。只有当两个变量指向同一块内存区域时,==才会返回真(1),否则返回假(0)。

接下来咱们拆解你代码里的三个变量,就能明白为什么会出现这样的结果:

逐个分析变量的内存情况

  • char s1[4];:这是一个在栈上分配的字符数组,你手动给它赋值为"aaa"。这个数组拥有独立的内存空间,数组名s1(当它退化为指针时)指向的是栈上这块数组的起始地址。
  • char *s2 = "aaa";:这里的"aaa"是字符串字面量,编译器会把它存储到程序的只读数据段(一块专门存放常量的内存区域)。s2是一个指针变量,它存储的是这个字面量在只读段的内存地址。
  • char *s3 = "aaa";:和s2一样,它指向的也是字符串字面量"aaa",但编译器有个常见优化:对于重复出现的相同字符串字面量,只会在只读段存储一份。所以s3和s2指向的是同一块内存区域。

解释你的输出结果

  • s1 == s2 返回0:s1指向栈上的数组地址,s2指向只读段的字面量地址,两者是完全不同的内存区域,地址不相等,所以结果为假。
  • s1 == s3 返回0:道理和上面一样,s1的地址和s3指向的只读段地址没有任何关系,自然不相等。
  • s2 == s3 返回1:因为编译器优化了相同的字符串字面量,让s2和s3指向同一块内存,它们的地址完全相同,所以==返回真。

正确比较字符串内容的方法

如果想要比较两个字符串的字面量内容是否相等,你需要使用标准库的strcmp()函数(需要包含头文件<string.h>)。这个函数会逐字符比较两个字符串的内容:

  • 返回0:表示两个字符串内容完全相等
  • 返回正数/负数:表示两个字符串在某个位置的字符不同

举个例子:

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

int main() {
    char s1[4]; s1[0] = 'a'; s1[1] = 'a'; s1[2] = 'a'; s1[3] = '\0';
    char *s2 = "aaa"; char *s3 = "aaa";
    
    printf("strcmp(s1, s2): %d\n", strcmp(s1, s2)); // 输出0,说明内容相等
    printf("strcmp(s2, s3): %d\n", strcmp(s2, s3)); // 输出0,内容相等
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:15