比较c中的两个相等数组,但输出显示不相等

时间:2012-01-12 18:08:54

标签: c arrays string pointers c99

经过长时间的休息,我回到了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标准究竟对这种情况说了什么吗?

7 个答案:

答案 0 :(得分:11)

当您使用指针==时(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 == str2true

要比较两个char*内容,请使用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");

<小时/> 1 char*版本中,这是真的。在char[]版本中,str1str2实际上是数组,而不是指针,但是当在str1 == str2中使用时,它们会衰减到指向数组的第一个元素,因此它们相当于该场景中的指针。

答案 1 :(得分:2)

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

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

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

谨慎一点;如果您已将字符串声明为char *而不是char [],则某些编译器实际上会将您的比较显示为相等,因为编译器会实现两个字符串相等并将它们折叠为一个。这意味着,它们都指向相同的字符串,指针比较也是如此。

曾经被咬过一次,再也没有,忘了VAX编译......:)

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

问题是当你使用

* str1 =“你好”; * str2 =“你好”;

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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