int main()
{
char *name = new char[7];
name = "Dolphin";
cout << "Your name is : " << name <<endl;
delete [] name;
}
Warum beschwert sich der VC++-Compiler nicht?
int main()
{
char *name = new char[7];
name = "Dolphin";
cout << "Your name is : " << name <<endl;
delete [] name;
}
Warum beschwert sich der VC++-Compiler nicht?
Das Problem mit diesem Code ist der Beginn der Zeile:
name = "Dolphin";
was in Ordnung ist, da es den Variablennamen auf die Stringkonstante "Dolphin" verweist, aber die Zeile:
delete [] name;
versucht, die String-Konstante zu löschen, die undefiniert ist.
Sie sollten etwas wie std::string verwenden, um Ihre Strings zu verarbeiten.
VC++ beschwert sich nicht, denn es ist C++, die Sprache erwartet, dass man weiß, was man tut.
"Mit C ist es leicht, sich selbst in den Fuß zu schießen. C++ macht es schwieriger, aber wenn du es tust, wird dein ganzes Bein weggesprengt." - Bjarne Stroustrup
Dieser Quellcode verdeutlicht den Unterschied zwischen einem schlecht geformten Programm und einem Programm mit Logikfehlern (Fehler, die dazu führen, dass ein Programm nicht richtig funktioniert). C++-Compiler müssen sich nur über ein schlecht geformtes Programm "beschweren", was bei diesem Quellcode nicht der Fall ist.
Zu den logischen Fehlern in diesem Programm gehören:
name = "Dolphin"
delete[]
auf einen Zeiger, der nicht von new[]
Außerdem, obwohl Sie nicht kopiert haben "Dolphin"
in das 7-Zeichen-Array einfügen, scheinen Sie dies beabsichtigt zu haben. Sie müssen darauf achten, dass die Zielzuweisung Platz für die acht Zeichen, aus denen die Zeichenfolge besteht "Dolphin"
( 'D'
, 'o'
, 'l'
, 'p'
, 'h'
, 'i'
, 'n'
y '\0'
).
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
10 Stimmen
Sie sollten Folgendes verwenden
std::string
die solche Dinge zulässt.4 Stimmen
Er beschwert sich nicht, weil bei C/C++-Programmierern davon ausgegangen wird, dass sie wissen, was sie tun. Auf "name" irgendwo anders hinzuweisen ist völlig legal. Obwohl ich in diesem Fall erwarten würde, dass GCC eine Warnung ausgibt, weil Sie einen (char *) Zeiger für den Zugriff auf den konstanten Abschnitt verwenden. Ich kenne mich mit VC++ nicht aus. Wenn Sie nichts sagen, gibt main() 0 zurück.
1 Stimmen
Warum sollte sie sich beschweren? Sie tun nichts Illegales, soweit es den Compiler betrifft. Compiler sind nicht telepathisch, sie wissen nicht, was Sie tun wollten, im Gegensatz zu dem, was Sie tatsächlich getan haben.
0 Stimmen
Gcc: Warnung: Veraltete Konvertierung von String-Konstante nach 'char*'