Daten aus array holen

Gast #5842440
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?
Gast #5842452
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...
#5842461
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.
#5842507
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.
Gast #5842523
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
#5842640
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.
Gast #5842668
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.