为什么“ ==”对于字符指针返回true?

时间:2018-11-21 03:32:08

标签: c string

在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 *是包含字符的位置的地址。那么,两个地址在这里如何相同?

1 个答案:

答案 0 :(得分:4)

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

C标准指定string literals might or might not be distinct arrays in memory, and that undefined things might happen if you modify them是为了允许编译器完全执行此操作。