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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Felix W. (catchup)


Bewertung
0 lesenswert
nicht 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

int *einlesen_array()
{
  int *array; //Pointer bzw. Array
  FILE *ptr; //Pointer der auf Beginn des Files zeigt
  int size = einlesen_size();  //dynamische Arrayanpassung als Laufvariable
  int i;
  
  //Pointer auf Beginn von Pfad definiert   
   ptr = fopen(pfad, "r");
  /********************************
   * Arraydefinition über malloc()*
   *******************************/
  array = (int *) malloc(size * sizeof(int));

  if (array == NULL)
  {
    printf("Speicher voll!\n");
    printf("Bitte Programm neustart.\n");
    return 0;
  }
  /**********************************
   * Füllen des Arrays mit Elementen*
   *********************************/
  for(i=0; i<size; i++)
  {
    fscanf(ptr,"%d",&array[i]);
  }
  free(ptr);
  return array;
}

: Verschoben durch Moderator
von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Warum gibst du den File Deskriptor frei?

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
fscanf hat auch einen Rückgabewert, den man auswerten sollte.

von S. R. (svenska)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.