Forum: Compiler & IDEs Realloc in Methode


von Tobias (Gast)


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

von g457 (Gast)


Lesenswert?

Meine Glaskugel sagt zu wenig RAM.

HTH

von Klaus W. (mfgkw)


Lesenswert?

Welchen Wert hat diagCache vor dem Aufruf?

von Tobias (Gast)


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.

von Tobias (Gast)


Lesenswert?

SO nochmal rumprobiert: Ich initialisiere in selber Datei mehrere 
globale Variablen. Sobald ich einige der Definitionen entferne 
gehts...also doch RAM? Naja wie schaffe ich nun platz?

von Rolf Magnus (Gast)


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.

von U.R. Schmitt (Gast)


Lesenswert?

Wäre interessant zu wissen was Du mit der Funktion erreichen willst. 
VIeleicht ist Dein Ansatz so einfach suboptimal.

von Tobias (Gast)


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.

von Rolf Magnus (Gast)


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?

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.