【问题标题】:C - Comparison of Arrays with == works, why? [duplicate]C - 使用 == 比较数组,为什么? [复制]
【发布时间】:2015-06-17 06:56:27
【问题描述】:

我有点困惑。我有以下功能:

int comp(char s1[], char s2[]) {
   return s1 == s2;
}

据我所知,这仅比较 char 数组 s1 和 char 数组 s2 中第一个元素的地址。

但奇怪的是,如果我比较(在 Visual Studio 中)两个相等的 char 数组,比如

 comp("test","test");

我得到 1(真)而不是 0(假)。但是地址不应该不同,因此结果应该总是0吗?

【问题讨论】:

  • 也许,编译器优化......使用"test"的相同实例......虽然不确定
  • 不要求两个相同的字符串字面量引用两个不同的字符串。
  • 对不起,malloc 和其他东西。
  • @cybersoft 和这个问题有什么关系?
  • 地址比较相等,因为string pooling

标签: c arrays comparison


【解决方案1】:

我会说这是使用相同字符串实例的编译器优化的结果。如果你做了这样的事情,你会证明 == 不像你建议的那样工作:

char s1[10];
char s2[10];
strcpy(s1, "test");
strcpy(s2, "test");
printf("%d\n", comp(s1, s2));

【讨论】:

    【解决方案2】:

    之所以如此,是因为在编译过程中,相同的字符串作为一个字符串存储在字符串池中。因此,两者都指向同一个地址,因为字符串池中只有一个“测试”字符串。

    【讨论】:

    • 但是这个想法是对的。
    【解决方案3】:

    字符串文字经常被优化编译器重用,所以如果你两次使用相同的字符串文字,两者将是完全相同的字符串文字。而且您的函数正在比较 pointers,并且由于两个字符串文字相同,因此您正在比较相同的指针,这当然会给您一个“真实”的值。

    【讨论】:

    • @hacks 因为我之前有另一个答案是基于我没有阅读问题:)
    • @hacks NMDV,但可能是因为忍者编辑。 :-)
    • @JoachimPileborg;哦。但是,现在好了。
    【解决方案4】:

    了解 mutabe 和不可变字符串的概念。比较时存储在堆栈中的字符串返回 true,但如果一个字符串在堆中另一个在堆栈中,则返回 false。

    第二个问题是,您是否使用 prpredefined 函数来比较 2 个字符串,那么函数的工作方式如下

    Compare(s1,s2) 在基于非统一字符的字典顺序中根据 s1 前面、等于或后面的 s2 返回正零或负数。

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多