vergleichen Sie zwei gleiche Arrays in c, aber die Ausgabe zeigt ungleiche
Nach einer langen Pause,bin ich zurück zu C, aber immer verwirrt, noch auf einige einfache Fragen.
So ist man hier.
Ist hier der einfache code :
#include<stdio.h>
int main() {
char str1[]="hello";
char str2[]="hello";
if(str1==str2)
printf("equal");
else
printf("unequal");
}
Ausgabe:
ungleiche
aber wenn ich dies ausprobiert ,es funktionierte
char *str1="hello";
char *str2="hello";
Ausgabe
gleich
Bitte wenn jemand eine ausführliche Erklärung dafür.
Kann mir jemand sagen was genau macht der C99-standard zu dieser situation sagen ???
mögliche Duplikate von Warum ist "a" != "a" in C?
danke, dass war die post ich war eigentlich auf der Suche nach, aber ich konnte es nicht aus..das ist wirklich sehr hilfreich
danke, dass war die post ich war eigentlich auf der Suche nach, aber ich konnte es nicht aus..das ist wirklich sehr hilfreich
InformationsquelleAutor Udit Gupta | 2012-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
==
mit Zeigern (wasstr1
undstr2
sind in beiden Fällen1) alles, was Sie tun, ist der Vergleich der beiden Adressen, um zu sehen, wenn Sie identisch sind. Wenn Sie das tunErstellen Sie zwei arrays auf dem Stapel, halten
"hello"
. Sie sind sicherlich auf unterschiedliche Speicher-Standorten, so dassstr1 == str2
istfalse
. Das ist wieWenn Sie
Erstellen Sie zwei Zeiger auf die globalen Daten
"hello"
. Die compiler, die erkennen, dass diese string-Literale sind die gleichen und können nicht geändert werden, wird der Zeiger auf die gleiche Adresse im Speicher, undstr1 == str2
isttrue
.Vergleichen Inhalt von zwei
char*
s, verwenden Siestrcmp
:Dies ist ungefähr das äquivalent von
1 In der
char*
version, das ist wahr. In derchar[]
versionstr1
undstr2
sind wirklich arrays, keine Zeiger, aber, wenn verwendet, instr1 == str2
Sie zerfallen zu Zeigern auf das erste Elemente des arrays, so dass Sie die Entsprechung zu Zeigern in diesem Szenario.InformationsquelleAutor Seth Carnegie
Sind Sie Vergleich der Zeiger auf die Zeichenfolgen und nicht die strings selber, sondern da sind Sie zwei verschiedene strings sind, sind Sie nicht "==" gleich.
Wenn Sie vergleichen von Zeichenfolgen in C, müssen Sie mit strcmp(str1, str2) a ' la
Ein Wort der Vorsicht; wenn Sie erklärt hatte, die strings als char* statt char[], einige Compiler würde tatsächlich Ihren Vergleich als gleich, da der compiler erkennt, die zwei strings gleich sind, und reduzieren Sie in einem. Das heißt, Sie würden beide auf das gleiche string-und die Zeiger der Vergleich wäre richtig.
Gebissen, einmal, danach nie wieder, verdammt VAX-compiler... 🙂
InformationsquelleAutor Joachim Isaksson
Strings (
char
Zeiger) inC
müssen im Vergleich mitstrcmp()
oder einem seiner Schwester-Funktionen.Weder sollte Recht arbeiten (d.h. Sie sollte immer
strcmp()
beim vergleichen von Zeichenfolgen), aber der Grund, die letztere wahrscheinlich gearbeitet wurde, ist, dass in der zweiten Beispiel, haben Sie eine einzelne Zeichenfolge, die im Speicher (wahrscheinlich), das ist "Hallo", und beidestr1
undstr2
am Ende zeigen auf, wie eine Optimierung.Die erste, aber tatsächlich erfordert zwei separate character-arrays angelegt werden, damit Sie nicht die gleichen Zeiger.
Danke für die Antwort, aber ich weiß, dass ich bin interessiert, was genau ist hier Los ??
InformationsquelleAutor Dan Fego
Du nicht vergleichen die arrays, die Sie vergleichen die Zeiger auf die Daten. Im ersten Fall, bei der Deklaration char[] Sie erhalten zwei verschiedene arrays an zwei Adressen, so sind Sie nicht gleich. Im zweiten Fall bekommen Sie ein Konstanten-array, so dass beide Zeiger bekommen können, legen Sie die gleiche Adresse, da der array const kann nicht geändert werden.
InformationsquelleAutor TJD
Das Problem ist, dass wenn Sie
*str1 = "Hallo";
*str2 = "Hallo";
Der compiler kann optimieren diese mit einem einzelnen Speicher und dafür str1 und str2 würden beide auf den gleichen Speicherplatz. Jedoch, wenn die Verwendung der array Schreibweise verwendet wird, der compiler wird höchstwahrscheinlich das anlegen von zwei arrays im Speicher und damit die Zeiger zeigen auf verschiedene Speicherbereiche.
wenn mit = = prüft die Gleichheit der Zeiger, nicht von den Saiten.
InformationsquelleAutor Peter Smith
In Ihrem ersten Fall, die Sie vergleichen die Zeiger auf die strings, die, natürlich, sind an zwei unterschiedlichen stellen und wird nicht gleich sein. Im zweiten Fall sind Sie Vergleich der beiden Zeichen, deutete auf den Anfang der Zeichenkette, die sowohl von 'h' und, natürlich, gleich.
InformationsquelleAutor Rob
Durch die Art und Weise, der zweiten kann man auch
unequal
. Alsequal
auf den meisten Plattformen möglich sind, der compiler-Optimierung, weil diese beidenhello
Zeichenfolgen müssen nicht unbedingt gespeichert werden, in der gleichen statischen Speicher.InformationsquelleAutor Peter Lee