1

如何用相等运算符比较两个字符串。我也在 GNOMEglib库中看到过。他们用运算符比较两个字符串==。这是代码:

/* Code from Singly Linked List - gslist.c*/


GSList*
g_slist_find (GSList        *list,
              gconstpointer  data)  // Here gconstpointer is `const void*`
{
  while (list)
    {
      if (list->data == data)    // What is compare here?
        break;
      list = list->next;
    }

  return list;
}

那么,glib 代码是否总是有效?

4

1 回答 1

3

==操作符在使用时将char*简单地检查它们是否指向相同的内存地址。当然,每个与 true with 比较的字符串对也将与 true==比较strcmp。然而,反过来是不正确的。两个字符串很可能在词法上是等价的,但位于不同的地址

例如

char* p1 = "hello world";

// p2 will point to the same address as p1.  This is how pointer 
// assignment work 
char* p2 = p1;
printf ("%s\n", p1 == p2 ? "true" : "false")            // true
printf ("%s\n", strcmp(p1, p2) == 0 ? "true" : "false") // true

// the addressed return by malloc here will not be the address
// of p1. 
char* p3 = malloc(strlen(p1) + 1);
strcpy(p3, p2);
printf ("%s\n", p1 == p3 ? "true" : "false")            // false
printf ("%s\n", strcmp(p1, p3) == 0 ? "true" : "false") // true
于 2013-08-01T19:55:00.307 回答