c语言 - 为什么"=="字符指针返回 true?



当我们比较C中的字符串时,我们会小心地使用strcmp(或其其他变体(来进行相等性检查。例如,如果一个字符串是char hello1[7] = "hello!",另一个字符串为char hello2[7] = "hello!",我们可以使用strcmp检查它们的内容是否相等。然而,我们不能使用==,因为==会比较每个数组的第一个元素的地址(由于数组衰减(,而这总是错误的。

那么,为什么当我尝试比较两个char *==时,结果是真的呢?例如:

int main() {
char *str1 = "Hello";
char *str2 = "Hello";
if (str1 == str2) {
printf("equaln");
} else {
printf("not equaln");
}
}

这将打印equal。根据我的理解,指针本质上是一个地址,因此char *是包含字符的位置的地址。那么,这里的两个地址怎么可能相同呢?

因为这两个地址相同。您的编译器在程序中包含了字符串"Hello"的一个副本,并使str1str2都指向它

C标准规定,字符串文字可能是内存中不同的数组,也可能不是,如果为了让编译器能够做到这一点而修改它们,则可能会发生未定义的事情。

最新更新