Forum: PC-Programmierung malloc() return Array (Programm terminiert nicht)


von Felix W. (catchup)


Lesenswert?

Guten Abend,
ich bin derzeit dabei ein C Programm zu schreiben, um int Zahlen aus 
einer Liste
einzulesen und zu sortieren. Meine Idee war die Listengröße in einer 
Funktion auszulesen und dementsprechend den Speicher mit malloc() zu 
reservieren. Anschließend soll dem reservierten Speicher die einzelnen 
Elemente zugewiesen werden. Das Programm läuft nur terminiert es nicht.
Würde mich freuen, falls mir jemand weiterhelfen könnte.
LG Felix

1
int *einlesen_array()
2
{
3
  int *array; //Pointer bzw. Array
4
  FILE *ptr; //Pointer der auf Beginn des Files zeigt
5
  int size = einlesen_size();  //dynamische Arrayanpassung als Laufvariable
6
  int i;
7
  
8
  //Pointer auf Beginn von Pfad definiert   
9
   ptr = fopen(pfad, "r");
10
  /********************************
11
   * Arraydefinition über malloc()*
12
   *******************************/
13
  array = (int *) malloc(size * sizeof(int));
14
15
  if (array == NULL)
16
  {
17
    printf("Speicher voll!\n");
18
    printf("Bitte Programm neustart.\n");
19
    return 0;
20
  }
21
  /**********************************
22
   * Füllen des Arrays mit Elementen*
23
   *********************************/
24
  for(i=0; i<size; i++)
25
  {
26
    fscanf(ptr,"%d",&array[i]);
27
  }
28
  free(ptr);
29
  return array;
30
}

: Verschoben durch Moderator
von Dirk B. (dirkb2)


Lesenswert?

Warum gibst du den File Deskriptor frei?

von Dirk B. (dirkb2)


Lesenswert?

fscanf hat auch einen Rückgabewert, den man auswerten sollte.

von S. R. (svenska)


Lesenswert?

Das ist hier das falsche Forum für solche Anfragen;
hier sollen fertige Projekte hin.

Mach mal statt free() ein fclose() da hin. Und es ist im Allgemeinen 
auch sinnvoll, den Rückgabewert von fscanf() auszuwerten.

Achso, und du solltest auch sicherstellen, dass deine Datei auch korrekt 
geöffnet wurde (d.h. ptr nicht NULL ist).

Regeln:
- malloc() und free() gehören zusammen.
- fopen() und fclose() gehören zusammen.

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Ob das das einzige Problem ist, kann ich mangels vollständigem Code 
nicht sagen, aber jedenfalls sollte die Datei ordnungsgemäß mit 
fclose(ptr) geschlossen werden.

von Felix W. (catchup)


Lesenswert?

Oh tatsächlich. Sorry bin im falschen Forum gelandet.
Ich werde es verschieben.
Der FILE Descritor ist freigegeben um meine .txt einzulesen mit den int 
Zahlen.
Stimmt, ich hab die abfrage von scanf() und NULL nur in der anderen 
Funktion das ist ungeschickt.

In diesem Fall danke und ich wechsle mal.
Grüße Felix

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Felix W. schrieb:
> Das Programm läuft nur terminiert es nicht.

Du solltest dir auch mal den Unterschied zwische "terminiert function" 
und "terminiert pragramm" anschauen:
https://en.cppreference.com/w/c/program/exit
https://en.cppreference.com/w/c/language/return
Wir können hier nichts genaueres dazu sagen weil du uns ja dein 
eigentliches Programm vorenthältst.

Ansonsten ist bei sowas der Debugger dein bester Freund um zu schauen wo 
es "nicht weiter geht".

von S. R. (svenska)


Lesenswert?

Felix W. schrieb:
> Der FILE Descritor ist freigegeben um
> meine .txt einzulesen mit den int Zahlen.

Du scheinst zu glauben, dass ein "FILE*" ein Zeiger auf den Dateiinhalt 
ist. Das stimmt nicht, das ist ein "File Handle", und da kannst du nicht 
einfach free() drauf anwenden!

Ein Filehandle (was von fopen() zurückgegeben wird) heißt bei mir 
grundsätzlich "fh" (oder eine Variante davon), dann weiß ich, dass ich 
da nur mit den C-Dateifunktionen (fread, fclose, feof, ...) drauf 
arbeiten darf.

Ein Filedescriptor (was von open() zurückgegeben wird) heißt bei mir 
grundsätzlich "fd" (oder eine Variante davon), damit ich weiß, dass ich 
da nur mit den anderen Dateifunktionen (read, close, ioctl, ...) drauf 
arbeiten darf.

Gewöhne dir sowas an.

von Felix W. (catchup)


Lesenswert?

Theor schrieb:
> Ob das das einzige Problem ist, kann ich mangels vollständigem Code
> nicht sagen, aber jedenfalls sollte die Datei ordnungsgemäß mit
> fclose(ptr) geschlossen werden.

Vielen Dank! Daran hat es gelegen. Ich habe es in  zwei Funktionen 
mehrmals geöffnet aber nicht geschlossen.

S. R. schrieb:
> Du scheinst zu glauben, dass ein "FILE*" ein Zeiger auf den Dateiinhalt
> ist.
Ja dafür hatte ich es tatsächlich gehalten. Das klingt nach einer guten 
Arbeitsweise. Werde ich mir angewöhnen. Vielen Dank.

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.