www.mikrocontroller.net

Forum: Compiler & IDEs free() auf Zufälligen Wert


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
was passiert wenn ich free(pointer) aufrufe, aber der Wert in
Wirklichkeit kein richtiger Pointer ist sondern ein zufälliger Wert im
Speicher.

Oder anders gefragt wie kann ich ein Element eines struct mit 0
initialiesieren damit das Problem erst garnicht auftaucht

typedef struct{
  uint8_t preamble;
  uint8_t startcode1;
  uint8_t startcode2;
  uint8_t len;
  uint8_t *data;  // <- sollte immer 0 sein
  uint8_t postamble;
} frame;

void free_frame(frame *frame){
  if(frame->data)
  free(frame->data);

}
main(){

  frame testframe;  // jetzt hat testframe.data einen zufälligen wert :(
  framefree(&testframe)
}


ich arbeite mit dem AVR-GCC.

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> hallo,
> was passiert wenn ich free(pointer) aufrufe, aber der Wert in
> Wirklichkeit kein richtiger Pointer ist sondern ein zufälliger Wert im
> Speicher.

undefiniert. Alles mögliche kann passieren.

> Oder anders gefragt wie kann ich ein Element eines struct mit 0
> initialiesieren damit das Problem erst garnicht auftaucht

Indem du dir zb. eine Funktion baust, die dir einen Frame
korrekt initialisiert und diese Funktion für jede neue
Frame Variable aufrufst.


Besser so ...
void free_frame(frame *frame)
{
  if( frame ) {
    free( frame->data );
    frame->data = NULL;
  }
}

... dann kannst du dir das if für frame->data in die Haare schmieren.
free darf man mit einem NULL Pointer beliebig oft aufrufen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Antwort,
ich hab schon fast befürchtet das es nicht ohne externe Zuweisung geht. 
Naja Pointer die irgendwo hinzeigen sind sowieso das schlimmste ;)

Gruß

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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