pointer als rückgabewert



  • Hallo,
    ich eine Datei mit Zahlen, die ich in einen Pointer einlesen will. Folgendes habe ich geschrieben:

    #include<stdio.h>
    #include<stdlib.h>
    
    int *einlesen(){
           int zaehler=0;
           int *zahl=(int *)malloc(100);
           FILE *datei;
           datei=fopen("zahlen.txt","r");
           if (datei != NULL){
                    while(fscanf(datei,"%d\n",&zahl)!=EOF)
                    zaehler++;}
    
           else
           printf("Datei konnte nicht geöffnet werden");
           fclose(datei);
           return zahl;
               }  
    
    int main(){
           int *zahl;
           zahl = einlesen();
    
           for(i=0;i<28;i++)
            printf("%d\n",*(zahl+i));
           system("Pause");
           return 0;
           }
    

    Probleme: Der Pointer wird in der main nicht ausgegeben. ???
    Wie bekomm ich meinen zaehler aus der Funk einlesen in meine main? Gibt es die Möglichkeit zwei Variablen aus einer Funk zurückzugeben?



  • baerminator schrieb:

    Probleme: Der Pointer wird in der main nicht ausgegeben. ???

    Woher weißt du das?
    Gibt das Programm nicht das aus, was du erwartest?

    Dann kann doch schon das Einlesen fehlerhaft sein.

    Also:
    zahl ist schon ein Pointer. Wenn du bei fscanf noch den Adressoperator & davorsetzt, wird der Pointer überschrieben, nicht der Inhalt.



  • In einen Zeiger kann man nichts einlesen, höchstens in einen Speicherbereich auf den ein Zeiger verweist.
    Mehrere Werte aus einer Funktion kann man z.B. in einer Struktur oder in einem Array als return-Wert oder Parameterzeiger zurückgeben.
    fscanf ist für Anfänger ungeeignet, ihr überblickt die Risiken nicht.



  • Klar kann man in einen Zeiger etwas einlesen:

    void *p;
      scanf("%p", &p);
    

    Man muss halt nur, wenn man ihn danach benutzen will, aufpassen, dass er auch irgendwohin zeigt. Es wird wohl eher selten sinnvoll sein, das zu tun, wenn man nicht gerade einen Debugger schreibt, aber es ist durchaus möglich.

    Ansonsten ist *scanf eigentlich nur dann problematisch, wenn man in Buffer einliest und nicht auf die Längenbegrenzung achtet. Man kann Anfängern durchaus beibringen, %s und %[ nie nackt zu benutzen - die Gründe dafür muss man eh spätestens abhandeln, wenn man mit Strings umgeht. *scanf ist nicht immer die sinnvollste Wahl, aber für die formatierte Eingabe von Zahlen ist es geschaffen.


Anmelden zum Antworten