【问题标题】:compare two equal array in c but output shows unequal比较c中的两个相等数组但输出显示不相等
【发布时间】:2012-02-09 00:49:00
【问题描述】:

经过长时间的休息,我回到了 C,但即使在一些简单的问题上也会感到困惑。 所以这里有一个。

这是简单的代码:

 #include<stdio.h>

 int main() {

    char str1[]="hello";
    char str2[]="hello";

    if(str1==str2)
            printf("equal");  
    else
            printf("unequal");
} 

输出: 不等

但是当我尝试这个时,它起作用了

  char *str1="hello";
  char *str2="hello";

输出 相等

如果有人可以提供详细的解释,请。 有人能告诉我 C99 标准对这种情况到底是怎么说的吗???

【问题讨论】:

  • Why is "a" != "a" in C? 的可能重复项
  • @TimCooper thanx 那是我真正在寻找的帖子,但我找不到它..这真的很有帮助

标签: c arrays string pointers c99


【解决方案1】:

C 中的字符串(char 指针)必须与 strcmp() 或其姊妹函数之一进行比较。

都不应该正确工作(即在比较字符串时你应该总是使用strcmp()),但后一个可能工作的原因是在第二个例子中,你有一个字符串内存(可能),即“hello”,str1str2 最终都指向它,作为优化。

然而,第一个实际上需要创建两个单独的字符数组,所以它们不是同一个指针。

【讨论】:

  • 因为他比较的是指针而不是字符串。
  • 感谢您的回答,但我知道,我对这里到底发生了什么感兴趣??
【解决方案2】:

您不是在比较数组,而是在比较指向数据的指针。在第一种情况下,当您声明 char[] 时,您会在两个地址处获得两个不同的数组,因此它们不相等。在第二种情况下,您会得到一个常量数组,因此两个指针都可以设置为相同的地址,因为数组是 const 不能更改。

【讨论】:

    【解决方案3】:

    问题是当你使用时

    *str1 = "你好"; *str2 = "你好";

    编译器可能会对此进行优化以使用单个内存空间,因此 str1 和 str2 都将指向相同的内存空间。但是,在使用数组表示法时,编译器很可能会在内存中创建两个数组,因此指针指向不同的内存位置。

    当使用 == 时,它会检查指针的相等性,而不是字符串的相等性。

    【讨论】:

      【解决方案4】:

      在您的第一种情况下,您将指针与字符串进行比较,当然,这些字符串位于两个不同的位置并且不相等。在第二种情况下,您将比较指向字符串开头的两个字符,它们都是 'h',当然也相等。

      【讨论】:

        【解决方案5】:

        当您使用指针执行== 时(这两种情况下str1str2 都是1),您所做的只是比较两个地址,看看它们是否是相同的。当你这样做时

        char str1[]="hello";
        char str2[]="hello";
        

        您正在堆栈上创建两个包含"hello" 的数组。它们肯定位于不同的内存位置,所以str1 == str2false。这就像

        char str1[6];
        str1[0] = 'h';
        str1[1] = 'e';
        str1[2] = 'l';
        str1[3] = 'l';
        str1[4] = 'o';
        str1[5] = '\0'; 
        
        // and the same thing for str2
        

        当你这样做时

        char *str1="hello";
        char *str2="hello";
        

        您正在创建两个指向全局数据"hello" 的指针。编译器看到这些字符串字面量是一样的,不能修改,就会让指针指向内存中的同一个地址,str1 == str2就是true

        要比较两个char*s 的内容,请使用strcmp

        // strcmp returns 0 if the two strings are equal
        if (strcmp(str1, str2) == 0)
            printf("Equal");
        else
            printf("Not equal");
        

        这大致相当于

        char *a, *b;
        
        // go through both strings, stopping when we reach a NULL in either string or
        // if the corresponding characters in the strings don't match up
        for (a = str1, b = str2; *a != '\0' && *b != '\0'; ++a, ++b)
            if (*a != *b)
                break;
        
        // print Equal if both *a and *b are the NULL terminator in
        // both strings (i.e. we advanced a and b to the end of both
        // strings with the loop)
        if (*a == '\0' && *b == '\0')
             printf("Equal");
        else
             printf("Not equal");
        


        1char* 版本中,这是真的。在char[] 版本中,str1str2 实际上是数组,而不是指针,但是当在str1 == str2 中使用时,它们会衰减为指向数组第一个元素的指针,所以它们在那种情况下相当于指针。

        【讨论】:

        • thanx man ...这是一个很好而详细的描述。它真的很有帮助,我希望也能帮助其他初学者...thanx很多
        【解决方案6】:

        您是在比较指向字符串的指针而不是字符串本身,但由于它们是两个不同的字符串,因此它们不是“==”相等。

        如果您在 C 中比较字符串,则需要使用 strcmp(str1, str2) a'la

        if(strcmp(str1, str2) == 0) {
        

        请注意;如果您将字符串声明为 char* 而不是 char[],则某些编译器实际上会将您的比较显示为相等,因为编译器意识到这两个字符串相等并将它们合并为一个。这意味着,它们都指向同一个字符串,并且指针比较为真。

        被那个咬过一次,再也不会了,该死的 VAX 编译器...:)

        【讨论】:

          【解决方案7】:

          顺便说一下,第二个也可以是unequal。在大多数平台上成为equal 是可能的编译器优化,因为这两个hello 字符串不一定必须存储在同一个静态内存空间中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-03
            • 2023-03-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多