Frage

Ich weiß, dass der richtige Weg „Strings“ in C zu vergleichen, ist durch strcmp verwenden, aber jetzt habe ich versucht, mit dem == Operator einige Zeichen-Arrays zu vergleichen, und bekam einige seltsame Ergebnisse.

Werfen Sie einen Blick auf den folgenden Code:

int main()
{
    char *s1 = "Andreas";
    char *s2 = "Andreas";

    char s3[] = "Andreas";
    char s4[] = "Andreas";

    char *s5 = "Hello";

    printf("%d\n", s1 == s2); //1
    printf("%d\n", s3 == s4); //0
    printf("%d\n", s1 == s5); //0
}

Der erste printf druckt richtig ein 1, die signalisiert, dass sie nicht gleich sind. Aber kann mir jemand erklären, warum, wenn die Zeichen-Arrays zu vergleichen, wird die == eine 0 Rückkehr?

Kann jemand mir bitte erklären, warum die erste printf eine 1 Rückkehr (dh sie sind gleich) und die Zeichen-Arrays eine 0 zurückkehren?

War es hilfreich?

Lösung

Der == vergleicht die Speicheradresse.
Es ist wahrscheinlich, dass Ihr Compiler s1 und s2 Punkt auf die gleichen statischen Daten macht Platz zu sparen.

dh. Der „Andreas“ in den ersten beiden Zeilen Code in ausführbaren Daten gespeichert. Der C-Standard sagt, dass diese Strings sind konstant und so die beiden Zeiger hat optomized auf denselben Speicher zeigen.

Die char [] -Leitungen schafft eine Variable, die durch die Daten in die Variable kopieren und so an unterschiedlichen Adressen auf dem Stapel während der Ausführung gespeichert.

Andere Tipps

Uh ... wenn == ein 1 druckt, bedeutet dies, sie ist gleich. Es unterscheidet sich von strcmp, die die relative Reihenfolge der Strings zurück.

Sie vergleichen Adressen und nicht die Saiten. Die ersten beiden sind konstant und wird nur einmal erstellt werden.

int main()
{
    char *s1 = "Andreas";
    char *s2 = "Andreas";

    char s3[] = "Andreas";
    char s4[] = "Andreas";

    char *s5 = "Hello";

    printf("%d\n", s1 == s2); //1
    printf("%p == %p\n", s1, s2);
    printf("%d\n", s3 == s4); //0
    printf("%p != %p\n", s3, s4);
    printf("%d\n", s1 == s5); //0
    printf("%p != %p\n", s1, s5);
}

Ausgabe auf meinem Computer, aber Sie bekommen die Idee:

1
0x1fd8 == 0x1fd8
0
0xbffff8fc != 0xbffff8f4
0
0x1fd8 != 0x1fe0

Warten Sie eine Sekunde ... 1 bedeutet wahr, 0 bedeutet falsch. So ist Ihre Erklärung teilweise nach hinten. Was, warum scheinen die ersten beiden Strings gleich zu sein: Der Compiler gebaut, dass ein konstanter String (s1 / 2) nur einmal

.

s1 == s2 bedeutet "(char*) == (char*)" oder dass die Adressen gleich sind.

Das Gleiche gilt für s3 == s4. Das ist der „ Arrays Zerfall in Zeigern “ bei der Arbeit .

Und Sie haben die Bedeutung des Ergebnisses des Vergleichs falsch:

0 == 0; /* true; 1 */
42 == 0; /* false; 0 */
"foo" == "bar"; /* false (the addresses are different); 0 */

Alle Werte von s1 bis s5 sind nicht char selbst, sie sind Zeiger char . Also, was Sie vergleichen ist die Speicheradressen der einzelnen Strings, anstatt die Saiten selbst.

Wenn Sie die Adressen so angezeigt werden, können Sie sehen, was die Vergleichsoperatoren tatsächlich arbeiten an:

#include <stdio.h>

int main() {
  char *s1 = "Andreas";
  char *s2 = "Andreas";

  char s3[] = "Andreas";
  char s4[] = "Andreas";

  char *s5 = "Hello";

  printf("%p\n", s1); // 0x80484d0
  printf("%p\n", s2); // 0x80484d0
  printf("%p\n", s3); // 0xbfef9280
  printf("%p\n", s4); // 0xbfef9278
  printf("%p\n", s5); // 0x80484d8
}

Genau dort, wo die Saiten im Speicher zugeordnet sind, ist die Umsetzung spezifisch. In diesem Fall weisen die s1 und s2 mit dem gleichen statischen Speicherblock, aber ich würde dieses Verhalten nicht erwartet tragbar sein.

Sie können keine Strings vergleichen, aber Sie können Zeiger vergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top