Frage zu reserviertem Speicher (malloc)

11/01/2011 - 10:53 von Thomas Barth | Report spam
Hallo,
wenn ich folgende Funktion zum zweiten Mal aufrufe, stürzt mein Programm
ab. Es hàngt mit dem unter der Variable memo reservierten Speicher
zusammen. "memo" soll beim Mischen einer Struktur nur einen Zwischenwert
speichern. Orientiert habe ich mich an der hier im C-Handbuch
(http://openbook.galileocomputing.de...en_006.htm)
unter Kapitel 15.6 dargestellten Sortier-Funktion.

/*
* Funktion zum Initialisieren und Mischen von reclist
*/
int initRecQueue (void) {
RECLIST memo *;

int cnt_queue = 0;
int rand1 = 0;
int rand2 = 0;

[hier wird die Struktur reclist mit daten gefüllt, die Anzahl wird in
cnt_queue gespeichert.]

memo = malloc(sizeof(RECLIST *));

if(NULL == memo) {
logError(__LINE__, DEBUG_PATH, "no memory to shuffle reclist");

} else {
for (i = 0; i < cnt_queue * 5; ++i) {
rand1 = getRandomValue(0, cnt_queue - 1);
rand2 = getRandomValue(0, cnt_queue - 1);

*memo = reclist[rand1];

reclist[rand1] = reclist[rand2];
reclist[rand2] = *memo;
}
}

return cnt_queue;
}


Gelöst habe ich es jetzt so, dass ich die Variable memo außerhalb der
Funktion stehen habe, und in der Funktion dann nur einmal initialisiere,
damit ich die Funktion mehrmals aufrufen kann.

RECLIST * memo;

...

int initRecQueue (void) {
...

//shuffle
if(NULL == memo) {
memo = malloc(sizeof(RECLIST *));
}

if(NULL == memo) {
logError(__LINE__, DEBUG_PATH, "no memory to shuffle rec_queue");

} else {
for (i = 0; i < cnt_queue * 5; ++i) {
rand1 = getRandomValue(0, cnt_queue - 1);
rand2 = getRandomValue(0, cnt_queue - 1);

*memo = reclist[rand1];

reclist[rand1] = reclist[rand2];
reclist[rand2] = *memo;
}
}

return cnt_queue;
}

Warum sollte memo nur einmal mit malloc initialisieren, auch wenn die
Variable in einer Funktion steht?

Und warum ist es eigentlich nicht erforderlich, free(memo) aufzurufen?
Weil es reclist abgelegt ist und der dieser Variable zugewiesene
Speicher beim Beenden des Programm ohnehin freigegeben wird?

Gruß, Thomas
 

Lesen sie die antworten

#1 Rainer Weikusat
11/01/2011 - 13:06 | Warnen spam
Thomas Barth writes:
C-Handbuch
(http://openbook.galileocomputing.de...en_006.htm)
unter Kapitel 15.6 dargestellten Sortier-Funktion.

/*
* Funktion zum Initialisieren und Mischen von reclist
*/
int initRecQueue (void) {
RECLIST memo *;

int cnt_queue = 0;
int rand1 = 0;
int rand2 = 0;

[hier wird die Struktur reclist mit daten gefüllt, die Anzahl wird
in cnt_queue gespeichert.]

memo = malloc(sizeof(RECLIST *));



Das ist jedenfalls Unsinn, denn es alloziert Platz fuer einen RECLIST
* and weist diese Addresse einer Variablen vom Typ 'RECLIST *' zu. Der
Typ von *memo ist aber RECLIST und nicht RECLIST * und man kann mit
Sicherheit davon ausgehen, das sizeof(RECLIST) > sizeof(RECLIST *)
gilt. Das ist im Original-Beispiel genaus falsch und korrekt waere wohl

memo = malloc(sizeof(RECLIST));

Bloss was das soll ist nicht ganz klar, den eine Deklaration von memo
als

RECLIST memo;

haette denselben Effekt ohne den malloc-Allokator bemuehen zu muessen und


if(NULL == memo) {
logError(__LINE__, DEBUG_PATH, "no memory to shuffle reclist");

} else {
for (i = 0; i < cnt_queue * 5; ++i) {
rand1 = getRandomValue(0, cnt_queue - 1);
rand2 = getRandomValue(0, cnt_queue - 1);

*memo = reclist[rand1];

reclist[rand1] = reclist[rand2];
reclist[rand2] = *memo;
}
}

return cnt_queue;
}



mit dessen Hilfe ein 'memory leak' zu verursachen.

[...]

Und warum ist es eigentlich nicht erforderlich, free(memo)
aufzurufen?



Weil memory leaks in Spielzeug-Programmen im allgemeinen egal sind.

Ähnliche fragen