Forum: Linux-Unix Programmierung
Moderatoren: juergen, Martin ConradThema: Speicheradressen
Speicheradressen
burner am 15.12.2003 um 22:00
ich hab ein kleines programm geschrieben, wie folgt:
*****************************************
int main(void) {
char buf[12];
char *p;
printf("gib ein kurzes wort ein: ");
scanf("%s", buf);
for(p = buf; *p; p++)
printf("%p\n", p);
return 0;
}
******************************************
nun, dass funktioniert soweit so gut, es gibt die speicheraddressen
der einzelnen buchstaben (so denk ich auf jedenfall) aus. nun lass ich
aber das programm durch den gdb laufen, dieser jedoch gibt mir andere
adressen aus, kann mir mal jemand erklaeren, wo da der haken ist??
gruss bjoern
--
Einer der vielen Gründe warum es Fehlermeldungen gibt ist, dass ich im Forum nicht posten muss "ich hatte irgend so nen komischen Fehler" ... :oops:
Speicheradressen
juergen (webmaster) am 16.12.2003 um 08:00
Auf die Speicheradresse selbst, wo das Programm sein Variablen ablegt, hast Du im Prinzip keinen Einfluss - da dies vom System bestimmt wirdd. Jedem Programm werden bestimmte Speicherbereich für bestimmte Zwecke zur Verfügung gestellt (siehe auch Das Speicherkonzept).
Wenn Du jetzt im Listing bspw. weitere Variablen einfügst, kann (wird) sich die Adresse der einzelnen Zeichen von buf wieder woanders befinden. Bspw.:
#include <stdio.h>
int main(void) {
/* füge das hier hinzu und wieder weg */
int x, y;
char buf[12];
char *p;
printf("gib ein kurzes wort ein: ");
scanf("%s", buf);
for(p = buf; *p; p++)
printf("%p\n", p);
return 0;
}
Schließlich ist ja eine Speicheradresse im RAM nicht von Dauer und nur für das eine Programm bestimmt. Zwar hat dein Programm immer ein Recht auf eine bestimmte Menge an Speicher aber ist dies nicht von dauer. Ich hoffe das einigermaßen einfach erklärt zu haben.
Gruss
Jürgen
P.S.: Gefährlicher Code:
char buf[12];
...
scanf("%s",buf);
Siehe Buffer Overflow
Speicheradressen
burner am 16.12.2003 um 11:17
einbischen hats geholfen, aber es koennte in dem fall sein, dass wenn ich
im gdb einen breakpoint
break scanf
setzte, und den zeiger auf das erste element im array auslese mit
info reg eax
dann sollten die folgenden werte doch irgendwie gleich sein, oder es kommt
halt noch etwas zu meinem programm hinzu, das mit dem breakpoint zu tun
hat.
die erste ausgabe des Programmes lautet: 0xbffffb7
die erste ausgabe im GDB lautet : 0xbffffd7
P.S.: das ist ein Programm zum rumspielen und ausprobieren
in "wirklichkeit" sollten ich schon testen, dass nicht zu
viel eingegeben werden kann!!
gruss bjoern
--
Einer der vielen Gründe warum es Fehlermeldungen gibt ist, dass ich im Forum nicht posten muss "ich hatte irgend so nen komischen Fehler" ... :oops:
Speicheradressen
juergen (webmaster) am 16.12.2003 um 12:43
Zitat:
P.S.: das ist ein Programm zum rumspielen und ausprobieren
in "wirklichkeit" sollten ich schon testen, dass nicht zu
viel eingegeben werden kann!!
Ich hoffe, dass dies nicht als Besserwisserei oder als Kritisierung von meiner Seite gesehen wurde - oder ich Dir sonst wie auf dem Fuss getreten bin - währe dann nicht meine Absicht gewesen
Ich habs halt nur erwähnt, weil viele Andere (u.a. Anfänger) auch die Threads lesen und daher --- aber es gehört ja nicht hierher.
Viele Grüsse
Jürgen
Speicheradressen
burner am 16.12.2003 um 13:34
dass wir uns richtig verstehen, ich habe sehr viel von deiner seite gelernt und bin
dir dafuer auch DANKBAR!!
und besserwissen werde ich's auf keinen fall.
-------------------------------------------------------------------------------
ich komm nur nicht draus, warum der gdb mir eine andere speicheradress ausgiebt,
was aber eigentlich auch nicht so wichtig ist, weils irgendwie mit beiden klappt.
--
Einer der vielen Gründe warum es Fehlermeldungen gibt ist, dass ich im Forum nicht posten muss "ich hatte irgend so nen komischen Fehler" ... :oops:
