在C语言中比较字符串时,请小心使用strcmp
(或其其他变体)进行相等性检查。例如,如果一个字符串是char hello1[7] = "hello!"
,而另一个字符串是char hello2[7] = "hello!"
,我们可以使用strcmp
检查它们的内容是否相等。但是,我们不能使用==
,因为==
将比较每个数组的第一个元素的地址(由于数组衰减),并且总是错误的。
那为什么当我尝试将两个char *
与==
进行比较时,结果为true?例如:
int main() {
char *str1 = "Hello";
char *str2 = "Hello";
if (str1 == str2) {
printf("equal\n");
} else {
printf("not equal\n");
}
}
这将打印equal
。根据我的理解,指针本质上是一个地址,因此char *
是包含字符的位置的地址。那么,两个地址在这里如何相同?
答案 0 :(得分:4)
因为两个地址 相同。您的编译器在程序中包含字符串“ Hello”的一个副本,并使str1
和str2
都指向它。
C标准指定string literals might or might not be distinct arrays in memory, and that undefined things might happen if you modify them是为了允许编译器完全执行此操作。