Article View: de.comp.lang.c++
Article #745Re: Schlechte Eingabemethode?
From: Martin Prange
Date: Tue, 07 Nov 1995 16:12
Date: Tue, 07 Nov 1995 16:12
66 lines
3316 bytes
3316 bytes
In article <47akku$99n@p235.informatik.uni-Bremen.de> uwe@mathematik.uni-Bremen.de (Uwe Behrens) writes:
In article <5x0NrSGKhjB@kl.in-berlin.de>, kl@kl.in-berlin.de (Kaspar Landsberg) writes:
|>
|> // bsp.cc - kleines Beispielprogramm
|>
|> #include <iostream.h>
|>
|> int main(void)
|> {
|> cout << "\nName: ";
|> char *eingabe = new char; // eingabe zeigt jetzt auf Speicherplatz
|> // von *einem* (1 Zeichen) char-Objekt
|> cin >> eingabe; // Benutzer gibt z.B. "Kaspar" ein (ohne " ")
|> cout << "Ergebnis: " << eingabe << "\n";
|> return 0;
|> }
|>
[ grosses Wundern, warum der Compiler zulaesst, dass mehr als ein Zeichen
eingegeben wird und das Programm die ganze Eingabe ausgibt, obwohl zuwenig
Platz da ist. ]
|> Und nun zur eigentlichen Frage: Der Compiler hat eigentlich fuer eingabe
|> nur Speicherplatz fuer ein Char-Objekt von *einem* Zeichen bereitgestellt.
|> Daher wird doch, falls mehr als ein Zeichen eingegeben wird (z.b.
|> "Kaspar") mehr Speicher benutzt, als eigentlich vom Compiler
|> vorhergesehen, bzw. bereitgestellt, so dass eventuell schon besetzter
|> Speicherplatz einfach durch die Eingabe von "Kaspar" bzw. von "aspar"
|> ueberschrieben wird, oder??
Ja. Das es trotzdem klappt,kann diverse Gruende haben, prompt faellt mir ein:
Es wird nicht ein Byte (char) sondern mehrere (z.B. 8) alloziert
weil das dem Speicherlayout besser entspricht. Dann hast Du eventuell
genug Platz. Portierbar ist das nicht.
Du hast einfach Glueck gehabt. Dort wo cin hingeschrieben hat,
stand einfach nichts wichtiges. Das ist auch nicht portierbar.
Vielleicht gibt's noch andere Gruende? (Spezialisten vor)
Hmm.
Bei solch einem kleinen Programm, wo bis auf cin, etc. noch kein
malloc (resp. new) gemacht wurde, ist es ALLERHOECHSTWAHRSCHEINLICH,
dass es an DIESER stelle NICHT knallt ( .. aber beim darauffolgenden
free (resp. delete), da die Speicherplatzverwaltung inkonsistent
geworden ist.
mein Rat:
Nimm doch einfach istrstream, dann bist Du den Aerger mit der
Speicheplatzverwaltung los.
BTW: Die in diesem thread geaeusserte Idee, doch einfach char[128] zu
nehmen, ist boese, denn es findet sich immer ein Idiot, der das
128. Zeichen eingibt...
Folge: macht Stack kaputt!
also: boese.
Martin Prange (prange@cs.tu-berlin.de) ////////////////////////////////////////
Member of the ALMAP Team at Alcatel SEL Berlin //// Home: +49 30 7848958 //////
//// Work: +49 30 7002 - 0 (OP) /
Technical Details
Message-ID:
<47o0gl$e7n@news.cs.tu-berlin.de>Path:
arc1-ca.pugleaf.net!cs.tu-berlin.de!prangeReferences:
<5x0NrSGKhjB@kl.in-berlin.de> <47akku$99n@p235.informatik.uni-Bremen.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!cs.tu-berlin.de!prange From: prange@cs.tu-berlin.de (Martin Prange) Newsgroups: de.comp.lang.c++ Subject: Re: Schlechte Eingabemethode? Date: 07 Nov 1995 16:12:00 GMT Organization: TU Berlin Fachbereich Informatik Distribution: world Message-ID: <47o0gl$e7n@news.cs.tu-berlin.de> References: <5x0NrSGKhjB@kl.in-berlin.de> <47akku$99n@p235.informatik.uni-Bremen.de> NNTP-Posting-Host: grippe.cs.tu-berlin.de Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit In-reply-to: uwe@mathematik.uni-Bremen.de's message of 02 Nov 1995 15:29:50 MET