Speicherfreigabe nach realloc in Funktionen

dandy

Grünschnabel
Hi Leute ich hät mal wieder ein "kleines" Problem:

Ich arbeite gerade an einem Projekt für die Uni weshalb ich hier keinen Code posten will, da ich da möglicherweise Probleme mit einem Plagiatsvorwurf bekomme.

Ich habe als Aufgabestellung folgendes bekommen:

Ich soll eine .bmp Datei einlesen. In dieser Datei ist im letzten Bit jedes Pixels ein Code versteckt (also wenn man dann jeweils 8 Bit wieder zusammen setzt ergibt sich jeweils wieder ein char den man wieder ausgeben muss)

Jetzt zu meinem Problem: Um die Errorfälle die sich bei so einem Programm ergeben können sollen wir mit den entsprechenden return (int Wert) zurück geben also zB return 7 für "Out of memory" (wenn der heap voll ist)

Da wir zwecks Übersichtlichkeit mit mehreren Funktionen arbeiten sollen, habe ich mir gedacht ich löse das Problem, indem ich die Funktionen mit einem int als Rückgabewert definiere, da ich so jederzeit in den entsprechenden Funktionen abbrechen kann sobald es zu einem Error kommt.

Ich muss (durch die Tatsache dass ich von den Funktionen nur ints zurück gebe) also mit Pointern arbeiten und diese in der main anlegen, sie dann an die entsprechende Funktion übergeben und kann sie dort wieder bearbeiten.

Wenn ich einen Pointer in der main anlege, sagen wir einen
Code:
 char *image_data_pointer = malloc(sizeof(char));
muss ich ihm ja einen Speicher reservieren (sagen wir mal die Größe von einem char) und wenn ich jetzt den Speicherbereich in der Funktion mit realloc erweitern will, kann ich den Speicher am Ende meines Programms nicht mehr freigeben und bekomme ein riesen Speicherleck...

Habt ihr vielleicht eine Idee wie ich einen Speicher, den ich in der main mit malloc angelegt, dann in einer Funktion mit realloc erweitert habe wieder freigeben kann?

LG Andi
 
Hi

bitte keine Fragen als Tutorials posten,
da bekommt man sehr sicher keine Antworten,
bis es verschoben wurde.

Zu deinem Problem:
Man könnte das mit einem Pointer auf den Pointer machen,
aber du machst dir das Ganze zu kompliziert.

Wenn du beim Beispiel genau weißt, dass die Variable im main genau ein einzelner char ist,
gibt es keinen Grund, mit malloc überhaupt anzufangen.

C++:
int funktion(char *param)
{
    printf("Der Wert ist %c \n", *param);
    return 0;
}

int main()
{
    char x = 1;
    funktion(&x);
    ...
}
Ein ganz normaler char.
Im main ganz ohne Pointer, ohne malloc, realloc, free...
 
Ohh hey sry für den Post ins falsche Forum..

Also bei meinem Programm geht es konkret um den Pointer, indem später die Bilddaten als chars gespeichert werden.
Da ich von der Funktion aber einen int Wert zurück bekomme muss ich ja den Pointer in der main anlegen. Wenn ich dem Pointer aber nicht mit malloc schon einen Speicher zuweise dann krieg ich ein Warning wenn ich ihn an eine Funktion als Parameter übergeben will.

In der Funktion lese ich erst aus dem .bmp Infoheader aus, wieviele Pixel das Bild hat und drum kann ich die Größe des benötigten Speichers erst dort mit realloc bestimmen und nicht schon in der main sagen - ich lese bsp. 300 Pixel ein.
Wahrscheinlich wärs klug erst eine Funktion zu schreiben die mir die Anzahl der Pixel ausliest, die dann an die main zurück gibt damit ich dann meinen Pointer gleich richtig bemessen kann.

Werd das jetzt mal ausprobieren.

LG
 
Die Warnung kannst du vermeiden, wenn du NULL zuweist (statt ein malloc zu machen)

Und für den geschilderten Fall brauchts dann doch Doppelpointer:
C++:
int funktion(char **param)
{
    ...

    return 0;
}
 
int main()
{
    char *x = NULL;
    funktion(&x);
    ...
    free(x);
    ...
}

In der Funktion kommt bei Verwendung von param
immer ein Stern dazu. ALso, was bei einem normalen Pointer param wäre ist jetzt *param,
und *param normal wird zu **param.
 
Zurück