Realloc in Methode

Gast #1794113
Lesenswert?

Hallo,

ich hoffe ihr könnt mir helfen. Folgender Code:

uint8_t openDiagCache(){
  // Allocate memory for diag-session
  diagCache = (char*) realloc (diagCache, 520*sizeof(char)); // HIER 
Stopt es.
  // Check if allocation was succesfull
  if (diagCache != NULL) {
    diagCacheOpen = 1;
  }
  return diagCacheOpen;
}

Das Problem ist der Code stoppt in der markierten Zeile. Wieso? Ich kann 
es mir nicht erklären ansonsten funktioniert realloc() einwandfrei. Auch 
in der Ebene über dieser Methode (d.h. in der Methode wo diese Methode 
aufgerufen wird funktioniert es noch). Habt ihr eine Idee. P.S. malloc() 
hat den selben Effekt, bleibt auch stecken.

DANKE!

Tobi
Gast #1794126
Lesenswert?

@HTH/g457, aber warum ist dann vor Methodenaufruf genug RAM vorhanden um 
den Befehl durchzuführen? Selbst mit 1*sizeof(char) geht es nicht, also 
RAM schließe ich aus. Beim ersten aufruf hat diagCache den Wert NULL.
Gast #1794307
Lesenswert?

Was verstehst du unter "HIER Stopt es"? Du hast ein Programm, das da so 
läuft (worauf eigentlich? ATtiny12 oder Cray XT5?), und das bleibt 
einfach so stehen?

Übrigens, das da:
1
  diagCache = (char*) realloc (diagCache, 520*sizeof(char)); // HIER
2
Stopt es.
3
  // Check if allocation was succesfull
4
  if (diagCache != NULL) {

produziert im Fehlerfall ein Memory-Leak. Wenn realloc fehlschlägt, 
bleibt nämlich der vorher allokierte Speicher unberührt. Da du aber den 
Zeiger diagCache schon überschrieben hast, kommst du an diesen Speicher 
nicht mehr ran. Man muß bei realloc immer das Ergebnis erst in einem 
temporären Zeiger zwischenpeichern und erst, wenn der nicht NULL ist, in 
den original-Zeiger kopieren.
Gast #1794358
Lesenswert?

Controler ist ein AT90CAN128. Es stoppt nicht war vll. ein wenig falsch 
ausgedrückt, Heap und Stack vermischen sich wohl => Der Controller 
fabriziert Unsinn. Das liegt daran, dass wahrscheinlich zu viel 
Speicherplatz im Ram verwendet wird. Als ersten Ansatz habe ich vor alle 
Strings in den Programmspeicher zu verfrachten. Die Allokation von 
520Byte ist schon zml. viel. In den alloziierten Bereich werden nach und 
nach Daten per UART/Eingabe von Touch hineingeschaufelt und bei einem 
bestimmtem Char wird der Inhalt ausgewertet. Wann das passiert ist aber 
nicht vorhersehbar (Usereingabe). Das ganze Konstrukt hat auch schon 
funktioniert (bis gestern Abend, 5 Revisionen vorher), das einzige was 
ich mir nach euren Tipps erklären kann wäre die unvernünftige 
Speicherverwaltung. Danke schon mal für eure Tipps.
Gast #1794397
Lesenswert?

Tobias schrieb:

> Die Allokation von 520Byte ist schon zml. viel.

Warum verwendest du da eigentlich realloc? Hast du einen kleinen Puffer, 
der mit der Zeit wächst? Dann mußt du nämlich bedenken, daß realloc 
unter Umständen temporär soviel Speicher braucht wie alte und neue 
Puffergröße zusammen.
Generell ist auch eine Allokation eines so großen zusammenhängenden 
Speicherblocks immer etwas problematisch, falls durch vorherige 
Allokationen der Speicher schon fragmentiert wurde.
Kannst du nicht eine feste Blockgröße definieren und die statisch 
anlegen?
#1794954
Lesenswert?

Tobias schrieb:

> In den alloziierten Bereich werden nach und
> nach Daten per UART/Eingabe von Touch hineingeschaufelt und bei einem
> bestimmtem Char wird der Inhalt ausgewertet.

Genau das ist etwas, was du auf einem µC mit recht arg limitiertem SRAM 
nicht machen willst. Du willst dich hier nicht auf malloc oder realloc 
verlassen, denn das kann ganz böse ins Auge gehen.

Was willst du den machen, wenn dir malloc meldet (oder realloc meldet), 
das kein Speicher mehr frei ist, obwohl rein rechnerisch noch was da 
sein müsste?

Daher allokiert man solche Speicher praktisch immer statisch im voraus 
und legt sich auf eine SPeichergröße fest, mit der man durchkommen muss.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren