4 Stimmen

Was ist an diesem Code falsch?

int main()
{
    char *name = new char[7];
    name = "Dolphin";
    cout << "Your name is : " << name <<endl;
    delete [] name;
}

Warum beschwert sich der VC++-Compiler nicht?

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.

1voto

5ound Punkte 1149

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

0voto

Brendan Long Punkte 51048

Strings im C-Stil müssen mit Null terminiert werden ("Dolphin \0 "). Der Compiler wird dies für Sie tun, aber Sie haben ihm nicht genug Platz gegeben. Ändern Sie es in :

char *name = new char[8];

0voto

Kate Gregory Punkte 18638

Besteht die Aufgabe speziell darin, "new" und "delete" zu verwenden, um zu beweisen, dass Sie wissen, wie es geht? In diesem Fall müssen Sie Platz für den Nullterminator sparen und strcpy . Wenn nicht, sollten Sie vielleicht die Initialisierung demonstrieren?

0voto

iamgopal Punkte 8109

Kann sein, weil VC++ denkt, dass, das ist, was Sie im Programm tun wollen. es gibt kaum Syntaxfehler. so seine ok. kann Linker Aufruf für Speicherleck Fehler?

Prüfen Compiler heutzutage auch auf Logik?

0voto

Daniel Trebbien Punkte 36975

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:

  1. Ein Speicherleck, verursacht durch die Zeile name = "Dolphin"
  2. Der Versuch eines Anrufs 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.com

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.

Powered by:

X