mikrocontroller.net

Forum: PC-Programmierung Daten aus array holen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Felix (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
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?

Autor: Nachdenklicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Sebastian S. (amateur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: Random .. (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für Datenstrukturen mit variabler Länge empfiehlt sich ein struct:
struct foo {
  uint16_t size;
  uint16_t type;
  uint8_t* buf;
};

Autor: Arno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
char buffer[20];

void tuWas(char * mBuffer, int length)
{
  char a = mBuffer[20+2];
}

int main(void)
{
  tuWas(buffer, 20);
}

Oder sprichst du von einem großen Array, in dem du nur die ersten 
Speicherstellen beschreibst? Also:
char buffer[20];

void tuWas(char * mBuffer, int length)
{
  char a = mBuffer[18];
}

int main(void)
{
  buffer[0] = 'a';
  buffer[1] = 'b';
  buffer[2] = 'c';
  tuWas(buffer, 3);
}

Das ist unproblematisch (solange du weißt, dass du zufällige Werte liest 
und solange die Längen alle zusammenpassen).

MfG, Arno

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.