Warum wird beim Ausdruck eines String-Arrays hexadezimal ausgegeben?

7

Warum druckt das folgende Programm "0x2ffee4" auf die Konsole?

%Vor%     
wazeeer 13.05.2015, 22:06
quelle

2 Antworten

2

Die Antwort von T.C. ist richtig, ich möchte auch erwähnen, dass, wenn Sie erwartet hätten, "toronto" mit cout auf der Konsole auszudrucken, dann würden Sie das tun wollen:

%Vor%

Immer wenn Sie ein Array eines beliebigen Typs während der Deklaration initialisieren möchten, müssen Sie = {}; Um das Element jedes Arrays durch Kommas getrennt zu setzen. Sehen Sie sich dieses Codebeispiel an:

%Vor%

Wenn Sie das Array bei der Deklaration nicht initialisieren, müssen Sie die Größe des Arrays angeben.

%Vor%

}

Wenn Sie den Klammeroperator nicht mit einem Indexwert verwenden, der an den Konsolenausgabestream std :: cout gesendet wird, ist der Hexadezimalwert korrekt T.C hatte bereits festgestellt; Es gibt die Adresse des ersten Index zurück. Dies ist der Grund, warum in c / c ++ Arrays und Zeiger ähnlich sind (sie sind nicht gleich, sondern verhalten sich fast wie einander). Der Hauptunterschied zu Arrays besteht darin, dass sie eine konstante Größe haben, die Größe zur Kompilierungszeit bekannt sein muss und nicht dynamisch in der Größe geändert werden kann, ohne den Inhalt in einer temporären Variablen zu speichern, während ein neues Array mit einer größeren Größe erstellt wird Kopieren Sie dann alle Daten in das neue Array und bereinigen Sie dann das alte Array. Mit Zeigern verhalten sie sich nicht so, Zeiger können dynamisch auf dem Heap unter Verwendung von new zugewiesen werden, müssen aber auch gelöscht werden, wenn diese Variable keine Speicherlecks mehr verhindert, wenn der Zeiger vorher gelöscht wird und versucht wird, darauf zuzugreifen Diese Speicheradresse ist nicht mehr gültig und gehört nicht zum Aufrufer. Diese werden normalerweise als nicht behandelte Ausnahmen, Heap-Fehler usw. angesehen und führen zum Absturz Ihres Programms. Dasselbe gilt für Arrays, wenn Sie versuchen, sie über ihre Grenzen hinaus zu indizieren.

%Vor%     
Francis Cugler 14.05.2015, 04:28
quelle
18

Die erste Zeile sollte nicht kompiliert werden, aber es gibt einen GCC-Fehler , das es kompiliert und sich ähnlich verhält wie

%Vor%

(8, weil "toronto" 8 Zeichen einschließlich der abschließenden Null enthält. Ja, das heißt, wenn Sie "Chargoggagoggmanchauggagoggchaubunagungamaugg" , es würde ein Array von 46 Strings erzeugen, die jeweils "Chargoggagoggmanchauggagoggchaubunagungamaugg" speichern.)

Unnötig zu erwähnen, dass Sie sich nicht auf einen Compilerfehler verlassen sollten.

Unter dem fehlerhaften Verhalten von GCC wäre city1 ein Array von std::string s; Es gibt keinen Operator << overload, der das Drucken einer solchen Sache unterstützt. Stattdessen wird das Array in std::cout << city1 in einen Zeiger auf sein erstes Element umgewandelt, und die im Zeiger gespeicherte Adresse wird stattdessen gedruckt.

Sie wollten wahrscheinlich std::string city1 = "toronto"; schreiben. Eine Zeichenfolge, kein Array davon.

    
T.C. 13.05.2015 22:12
quelle

Tags und Links