PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Pointer aus Funktion zurückgeben


robobimbo
2007-12-09, 10:35:32
Hallo zusammen,

Aufgabe aus der FH - dynamische Speicherverwaltung ( noch ganz einfach, 1. Semester)

Aufgabestellug:
Benutzer gibt eine Arraygrösse n ein, das Array ist dynamisch (mittels malloc) zu erzeugen und mit Zufallswerten zu füllen. Soweit noch kein Problem

Der Benutzer gibt ein zahl p ein (p<n) - das sind aufsteigend sortiert die ersten p Elemente des vorhin erstellten Arrays - d.h. Array1 kopieren, sortieren und die ersten p Elemente ausgeben.

Meine Vorgehensweise (verkürzt):

mainfunktion:

Deklaroeren der beiden Pointervariablen für die Speicherblöcke Eingabe und Ausgabe, sowie der beiden Ints für die Anzahl der jeweilgen Items
int ar_groesse = 0;
int ar_output = 0;
int *ar_daten = NULL;
int *ar_ausgabe = NULL;

Einlesen der Anzahl und reservieren des Speicherbereichs, füllen mit Zufallswerten, ar_daten teshalber ausgeben --> funktioniert.

Einlesen der Anzahl der auszugebenden Elemtent.

Aufrufen der Funktion "verarbeite":
ar_daten --> Original array
ar_groesse --> Grösse des Array ar_daten
ar_ausgabe --> Pointervariable die dann am Ender der Funktion auf das Ausgabearray zeigen soll
ar_output --> Anzahl der Elemente die in ar_ausgabe sein sollen

int verarbeite(int *ar_daten, int ar_groesse, int *ar_ausgabe, int ar_output)
{
int *temp = NULL;
int i=0;

temp = (int*) malloc(ar_groesse * sizeof (int));
if (temp == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}

ar_ausgabe = (int*) malloc(ar_output * sizeof (int));
if (ar_ausgabe == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}

for(i=0; i<ar_groesse; i++) *(temp+i) = *(ar_daten+i);

shell_sort(temp, ar_groesse);
printf("\n\nDas Kopie Array nun sortiert: \n");
output(temp, ar_groesse);

for(i=0; i<ar_output; i++) *(ar_ausgabe+i) = *(temp+i);

return 0;
}

Die Funktion macht soweit das richtige, wenn ich es mit dem Debugger ansehe (die Funktion output gibt nur das array am schirm aus).
Was mich wundert - innerhalb der Funktion bekommt *ar_ausgabe eine Adresse, sobald ich die main zurückspringe hat sie dort wieder den Wert "NULL" und bringt mir natürlich bei entsprechenden Aufruf eine Fehlermeldung:

if (verarbeite( ar_daten, ar_groesse, ar_ausgabe, ar_output)) printf("Fehler in der Funktion verarbeite!!");

printf("\n\nDas ersten %d Elemente: \n", ar_output);
output(ar_ausgabe, ar_output);

Wo liegt denn hier mein Denkfehler?

tia

robo

robobimbo
2007-12-09, 10:39:22
hat sich erledigt :) mit dem funktionsende wir auch mein speicherbereich freigegeben, stimmts? :)

Ectoplasma
2007-12-09, 11:11:46
hat sich erledigt :) mit dem funktionsende wir auch mein speicherbereich freigegeben, stimmts? :)

Ne, stimmt nicht. Den Speicher den du mit malloc allozierst, wird nirgends freigegeben. Vielmehr hast du ein wunderbares Speicherlek produziert ...

robobimbo
2007-12-09, 11:51:45
ja, das hab ich mittlerweile auch behoben :)

Neomi
2007-12-09, 17:04:21
Deine Pointer-Parameter werden als Kopie übergeben, du überschreibst also nur eine lokale Kopie. Wenn du den Pointer anpassen willst, mußt du schon einen Pointer oder eine Referenz auf einen Pointer übergeben. Und dann darfst du auch nicht am Ende der Funktion den Speicher wieder freigeben (von wegen "behoben", falls du das gemacht hast), sondern später außerhalb der Funktion "verarbeite". In der hast du übrigens noch mehr Fehler, aber dazu solltest du erstmal die aktuelle Version posten.

Superguppy
2007-12-09, 23:23:05
Und Speicher solltest du am Ende wieder mit free() freigeben.

robobimbo
2007-12-10, 13:15:33
Also der Speicher wird nun in der Main angefordert und auch wieder freigegeben


int verarbeite(int *ar_daten, int ar_groesse, int *ar_ausgabe, int ar_output)
{
int *temp = NULL;
int i=0;

// Temporären zwischenspeicher reservieren
temp = (int*) malloc(ar_groesse * sizeof (int));
if (temp == NULL) { printf("\n FEHLER: Konnte Speicherbereich nicht reservieren!!"); return -1;}

// Array kopieren
for(i=0; i<ar_groesse; i++) *(temp+i) = *(ar_daten+i);

// Temporäres Array sortieren
shell_sort(temp, ar_groesse);
printf("\n\nDas Kopie Array nun sortiert: \n");
output(temp, ar_groesse);

// Die ersten ar_output Elemente in das ausgabe_array kopieren
for(i=0; i<ar_output; i++) *(ar_ausgabe+i) = *(temp+i);

// Speicher wieder freigeben
free(temp);
temp = NULL;

return 0;
}



Anmerkung - keine Fehlerüberprüfung, wir gehen davon aus das keine Eingabefehler gemacht werden