Moin,
da sind wir uns sehr ähnlich. Ich möchte auch immer jeden Schritt wissen, sonst kapier ich es auch gar nicht so richtig. Deshalb macht mir C gerade so richtig Spaß.
genau. ;-)
Das heisst also, ob ich einen Array übergebe oder nur einen Pointer auf das erste Element, ist egal?
Ja. Oder anders gesagt: Wenn du ein Array übergibst, *ist* das in Wirklichkeit *immer* nur ein Zeiger auf das erste Element.
Bei *(f+n) wandere ich also n Schritte vor im Speicher.
Richtig.
Kann man so auch in Speicherbereiche gelangen, die eigentlich nicht zu f gehören? Wäre das ein Buffer-overflow?
Ganz genau. Entweder man gelangt so in Speicherbereiche, die einem selbst (also dem ausführenden Programm) gar nicht mehr "gehören" - dann bekommt man Haue von der Speicherverwaltung des OS ("Segmentation Fault", "Dieses Programm wurde wegen eines unzulässigen Vorgangs beendet"). Oder man erreicht Speicherbereiche, die noch zum Programm gehören, und schreibt sich damit selbst andere Daten kaputt.
Dem richtig "guten" Hacker gelingt es dann und wann, durch Falscheingaben, die vom Programm nicht erkannt werden, einen Buffer Overflow so gezielt hervorzurufen, dass er auf diesem Umweg in bestimmten Variablen genau die Werte hat, die er dort haben möchte, aber auf ehrlichem Weg nicht erreicht.
Und da C keine integrierte Überprüfung von Zeigern und Array-Indexen hat, ist diese Sprache besonders anfällig für Buffer Overflows. Es ist daher Aufgabe des Programmierers, auf solche Dinge sehr genau zu achten.
Ciao,
Martin
Wer im Glashaus sitzt, sollte Spaß am Fensterputzen haben.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(