malloc() return Array (Programm terminiert nicht)

OP #6335475
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
}
#6335483
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.
Gast #6335487
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.
OP #6335490
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
(Firma: egal) #6335499
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".
#6335508
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.
OP #6335521
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.