Hallo, ich habe eine Funktion, die einen Array und die länge des Arrays als Parameter erhält. Im Array stehen Daten die ich auswerten möchte. Ich hole mir direkt am Anfang der Funktion die Daten aus dem Array. Wenn ich alle daten geholt habe, überprüfe ich diese. Unter anderem auch die Länge. Wenn die Länge nicht stimmt, gebe ich eine Fehlermeldung aus. Meines wissens nach, sollte es so keine Probleme geben. Wenn der Array nur 3 werte hat und ich mir den 5 wert hole, steht da halt irgendwas drinn. Es kommt aber nicht zu einem Absturz oder ähnlichem. Ist das richtig? Oder ist es besser wirklich erst die Länge zu überprüfen und dann die Daten holen?
So lange du nur lesend zugreifst und Dir bewußt bist, daß Du bei den Elementen die "hinter" dem Ende liegen, Mist stehen hast, ist das normalerweise unproblematisch. Außer Du bist auf einer Plattform, die das abfängt und darauf irgendwie reagiert...
Wie kann man, wenn das Array und dessen Länge bekannt sind, hinter das Teil grapschen? Übrigens: Die Werte hinter dem Array können auch richtig "aussehen", sind es aber nicht. So Du also in das Nirwana grabscht, gibt es keine vernünftige Möglichkeit, dies zu überprüfen.
:
Bearbeitet durch User
Nachdenklicher schrieb: > So lange du nur lesend zugreifst und Dir bewußt bist, daß Du bei den > Elementen die "hinter" dem Ende liegen, Mist stehen hast, ist das > normalerweise unproblematisch. Das ist es normalerweise, aber allgemein ist es trotzdem in C verboten. Und das gilt nicht nur für den Zugriff, sondern sogar schon für das reine Erzeugen des Zeigers. Pointer-Arithmetik ist nur innerhalb des Arrays oder ein Element hinter dessen Ende erlaubt. Ein Element hinter dem Ende ist dabei aber nur für die Pointer-Arithmetik erlaubt, nicht für den Zugriff.
:
Bearbeitet durch User
Für Datenstrukturen mit variabler Länge empfiehlt sich ein struct:
1 | struct foo { |
2 | uint16_t size; |
3 | uint16_t type; |
4 | uint8_t* buf; |
5 | };
|
Nachdenklicher schrieb: > So lange du nur lesend zugreifst und Dir bewußt bist, daß Du bei > den > Elementen die "hinter" dem Ende liegen, Mist stehen hast, ist das > normalerweise unproblematisch. Außer Du bist auf einer Plattform, die > das abfängt und darauf irgendwie reagiert... Eigentlich sollte das jedes halbwegs moderne Betriebssystem der letzten ca. 25 Jahre tun, zumindest wenn man hinreichend weit hinter dem Ende des Arrays zugreift und dabei die für das Programm legalen Speicherbereiche verlässt (wir sind hier ja im Unterforum PC-Programmierung, auf µCs ohne Betriebssystem sieht das idR anders aus). (Erzeugt dieses Verhalten nicht unter Windows 95 die berühmte "Allgemeine Schutzverletzung"?) Wenn man nur zwei Bytes hinter das Array greift, hat man aber gute Chancen, dass man noch nicht aus dem Speicherbereich des Programms hinaus gelaufen ist. Probier es halt aus:
1 | char buffer[20]; |
2 | |
3 | void tuWas(char * mBuffer, int length) |
4 | {
|
5 | char a = mBuffer[20+2]; |
6 | }
|
7 | |
8 | int main(void) |
9 | {
|
10 | tuWas(buffer, 20); |
11 | }
|
Oder sprichst du von einem großen Array, in dem du nur die ersten Speicherstellen beschreibst? Also:
1 | char buffer[20]; |
2 | |
3 | void tuWas(char * mBuffer, int length) |
4 | {
|
5 | char a = mBuffer[18]; |
6 | }
|
7 | |
8 | int main(void) |
9 | {
|
10 | buffer[0] = 'a'; |
11 | buffer[1] = 'b'; |
12 | buffer[2] = 'c'; |
13 | tuWas(buffer, 3); |
14 | }
|
Das ist unproblematisch (solange du weißt, dass du zufällige Werte liest und solange die Längen alle zusammenpassen). MfG, Arno
Arno schrieb: > Wenn man nur zwei Bytes hinter das Array greift, hat man aber gute > Chancen, dass man noch nicht aus dem Speicherbereich des Programms > hinaus gelaufen ist. Probier es halt aus: Ausprobieren gibt aber keine Garantie, dass es immer so funktioniert. Beispiel Mikrocontroller ohne Memory Protection. Ich kann im Speicher auf beliebige Adressen zugreifen, aber halt nur im Speicher. Liegt mein Array jetzt zufällig am Ende des Speichers, dann geht es plötzlich nicht mehr. Deshalb ist der Zugriff außerhalb von Datenstrukturen auch undefined.
Ich würde die Zugriff in der Funktion auf jeden Fall überwachen, den Wert über Zeiger (called by reference) zurück liefern und den Retourwert der Funktion für die Erfolgsmeldung verwenden. Nur so ist eine weitere Fehlerbehandlung möglich.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.