C Tutorial von Uni -> Return Wert auf Zeiger



  • Hallo Jungs,
    war eben bei einen Kollegen der zur Zeit an der FH studiert und da lagen seine aktuellen C Unterlagen aufn Tisch. War so neugierig und hab mir das Dingens mal angesehen und glaube dort einen üblen Fehler gesehen zu haben.

    Hier der Code

    char *eingabe(char *str) 
     {
       char input[255];
       printf("Bitte %s eingeben: ",str);
       fflush(stdin);
       scanf("%s", input);
       return input; // liefert Zeiger auf string
     }
    
     char input[20]; // globale Variable
     int main()
     {
       char *ptr;
       ptr = eingabe("Vorname");
       printf("Hallo %s\n",ptr);
       ptr = eingabe("Nachname"); // call Eingabe
       printf("%s, interssanter Nachname\n",ptr);
       return 0;
     }
    

    Wenn der User in der Funktion nun seinen Vornamen bzw. Nachnamen eingibt, wird ja die lokale Variable char input[255] verwendet und nicht die global char input[20].
    Das hat zur Folge, wenn die Funktion verlassen wird (also nach eingabe des Namens), das das lokale Char-Array wieder auf den Stack freigeben wird. Nun referenziert der Zeiger ptr der main Funktion aber auf einen Speicherbereich (bzw. besser gesagt auf den Anfang des Strings) der von einem Call oder sonst etwas wieder überschrieben werden kann...

    Sehe ich da nur eine Besonderheit nicht oder lernen die Studis wirklich eine Memoryviolation vom feinsten?

    Gruß
    der etwas verwirrte codefrag



  • Ja, das ist waschechter Bullshit. Das fflush(stdin) ist auch nett.



  • Aber wenigstens "int main()" ist richtig 😃



  • codefrag schrieb:

    Sehe ich da nur eine Besonderheit nicht oder lernen die Studis wirklich eine Memoryviolation vom feinsten?

    wenn du rauskriegst, warum dort noch c gelehrt wird, erklärt sich auch der rest.



  • volkard schrieb:

    codefrag schrieb:

    Sehe ich da nur eine Besonderheit nicht oder lernen die Studis wirklich eine Memoryviolation vom feinsten?

    wenn du rauskriegst, warum dort noch c gelehrt wird, erklärt sich auch der rest.

    Weisst du denn was er dort studiert? 😉



  • int main() zwar richtig, aber bei scanf das & vergessen

    MfG Spacemuck



  • Spacemuck schrieb:

    int main() zwar richtig, aber bei scanf das & vergessen

    Nein, an der Stelle (Eingabe in char-Arrays) gehört kein & hin.


Anmelden zum Antworten