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

