Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » char=ein buchstabe?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ] [ 6 ]
010
24.07.2003, 09:20 Uhr
0xdeadbeef
Gott
(Operator)


@kronos: Das wäre auch in C ein Absturz. In C++ wüde man übrigens normalerweise die Klasse string benutzen, die das alles automatisch übernimmt:

C++:
#include <iostream>
#include <string>

using namespace std;

int main() {
    string s;
    cin >> s;
    cout << s << endl;

    return 0; //Um ganz korrekt zu sein :wink:
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
24.07.2003, 14:34 Uhr
kronos
Quotenfisch
(Operator)



Zitat:
0xdeadbeef postete
@kronos: Das wäre auch in C ein Absturz.

besser gesagt ein compiler-fehler, weil's ja kein cin/cout gibt...
mit scanf und printf dürfte das aber kein problem sein...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
24.07.2003, 14:49 Uhr
0xdeadbeef
Gott
(Operator)


Ha, ha. Ich meinte schon, dass das, wenn du scanf etc. benutzt, einen Absturz (genauer gesagt, ein SIGSEGV bzw. einen GPF) zur Folge hätte. Wenn du schreibst:

C++:
char *p;


dann zeigt der irgendwo in die Gegend, und mit hoher Vermutlichkeit auf einen Speicherbereich, in den du nicht schreiben darfst. Wenn du dann schreibst:

C++:
scanf("%s", p);


versucht scanf, genau da hinzuschreiben. Und da schmiert dir das Programm ab.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
24.07.2003, 15:25 Uhr
~rammellaus
Gast


also das mit name[20] klappt gut! werde das jetzt erst nehmen... hoffe das ich in meinem buch bald was über prontf und diesen string lerne
hrrrr ich bin wissbegierig
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
24.07.2003, 15:35 Uhr
kronos
Quotenfisch
(Operator)


also bei mir funktioniert sowas in der regel. ich kenn mich zwar nicht so gut aus mit den hintergründen von speicherzugriffen aber AFAIK:


Zitat:
0xdeadbeef postete
Wenn du schreibst:

C++:
char *p;


dann zeigt der irgendwo in die Gegend,


stimmt nicht, der zeigt gar nicht. da wird bloß eine variable deklariert, die in der lage ist ein speicheraddresse zu speichern. ist also ein NULL-pointer.

Wenn du dann schreibst:

C++:
scanf("%s", p);


versucht scanf, genau da hinzuschreiben. Und da schmiert dir das Programm ab.[/quote]
scanf schreibt die char-folge in den speicher, endet mit 0 und legt die speicheraddresse des ersten chars in p ab.
die lokalen variablen kommen ganz oben auf den stack, daher wird in meinem beispiel auch nix überschrieben. problematisch wirds dann erst mit zwei strings die überlappen könnten.
wie das bei 'nem OS ohne virtual memory management aussieht weiß ich nicht, das war vor meiner zeit...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
24.07.2003, 15:47 Uhr
0xdeadbeef
Gott
(Operator)



C++:
char *p;


deklariert eine Variable, weist aber keinen Wert zu. Das heißt, da kann alles mögliche drinstehen, in der Regel ziemlicher Mist (und kein NULL-Pointer, den müsste man erst explizit zuweisen). Und das bedeutet, dass p mit ziemlicher Sicherheit nicht auf den Stack zeigt. Wenn du diesen Mist jetzt einfach so an scanf übergibst, denkt scanf, dieser Mist wäre eine Speicheradresse, an der du Speicher für den String reserviert hast, durch malloc oder ein Array beispielsweise. Das bedeutet, dass scanf die Zeichen an die Adresse schreibt, die in p drinsteht - wie wir uns erinnern, steht da aber völliger Blödsinn drin. Nun stell dir mal vor, das Ding zeigt irgendwo in den Kernel-Space, oder in den Speicher einer anderen Applikation. Du kannst die wildesten Effekte damit haben, und so ziemlich jeder halbwegs vernünftige Kernel wird dir sofort ein SIGSEGV schicken.

Was du mit dem Stack willst, ist mir schleierhaft, der spielt in diesem Zusammenhang überhaupt keine Rolle.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.07.2003 um 15:48 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
24.07.2003, 15:54 Uhr
ao

(Operator)



Zitat:
kronos postete
also bei mir funktioniert sowas in der regel.


was, wenn es tatsächlich stimmt, blanker Zufall ist und überhaupt nichts beweist.

Zitat:

scanf schreibt die char-folge in den speicher


In welchen Speicher denn? Es gibt keinen.

Zitat:

endet mit 0 und legt die speicheraddresse des ersten chars in p ab.


Das stimmt nicht. Um p modifizieren zu können, müßte scanf nicht p, sondern &p übergeben bekommen.

scanf nimmt die Adresse, wo p (zufällig oder aufgrund irgendeiner Vergangenheit) hinzeigt und ballert die Bytes dort hin. Wenn du Glück hast, bekommst du eine GPF (oder SegFault) und weißt sofort, daß du ins Klo gegriffen hast. Wenn du Pech hast, hast du irgendwelche Daten überschrieben und merkst das (vielleicht) erst viel später an einer ganz anderen Stelle.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
24.07.2003, 16:40 Uhr
kronos
Quotenfisch
(Operator)



Zitat:
0xdeadbeef postete
[i]
C++:
char *p;


deklariert eine Variable, weist aber keinen Wert zu. Das heißt, da kann alles mögliche drinstehen, in der Regel ziemlicher Mist (und kein NULL-Pointer, den müsste man erst explizit zuweisen).

stimmt, da hast du recht...


Zitat:
Und das bedeutet, dass p mit ziemlicher Sicherheit nicht auf den Stack zeigt.

also bei windows und linux sind die RAM-addressen imho virtuell und das system sorgt dafür, dass jedes programm schön im ihm zugewiesenen arbeitspeicher bleibt und nicht irgendwo im space von anderen prozessen rumlesen kann. das heißt des pointer zeigt vielleicht irgendwo in die gegend, aber auf jedenfall in eine gegend wo das programm auch hinschreiben darf.

naja, vielleicht ist das auch blödsinn was ich hier schreibe, aber ich habe bei sowas noch nie einen fehler bekommen und anders kann ich mir das nicht erklären...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
24.07.2003, 16:47 Uhr
kronos
Quotenfisch
(Operator)



Zitat:
ao posteteWenn du Pech hast, hast du irgendwelche Daten überschrieben und merkst das (vielleicht) erst viel später an einer ganz anderen Stelle.

jo, damit wurde ich des öfteren konfrontiert, aber nur in der form, dass irgendwelche zeichenfolgen überlappen. wenn ich nur einen string auf den speicher loslasse gibt's wirklich nie probleme... vielleicht deichselt ja das mein copiler irgendwie? (lcc32)
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
24.07.2003, 18:12 Uhr
ao

(Operator)



Zitat:
kronos postete
also bei windows und linux sind die RAM-addressen imho virtuell und das system sorgt dafür, dass jedes programm schön im ihm zugewiesenen arbeitspeicher bleibt und nicht irgendwo im space von anderen prozessen rumlesen kann.


Vor allem rumschreiben, das ist viel schlimmer. Das ist aber nur ein Schutzmechanismus, der verhindert, daß ein wildgewordenes Programm andere Programme oder sogar das Betriebssystem mit runterreißt.

Zitat:

das heißt des pointer zeigt vielleicht irgendwo in die gegend, aber auf jedenfall in eine gegend wo das programm auch hinschreiben darf.


Das ist nicht richtig. Virtual Memory heißt nicht, daß ein Programm unter jeder denkbaren Adresse automatisch gültigen Speicher vorfindet. Grundsätzlich gilt: Wer Speicher will, muß ihn sich holen, entweder auf dem Stack (als lokale Variable) oder per malloc vom Betriebssystem.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ] [ 6 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: