Speicherzugriffsfehler - C-Programm



  • Hallo zusammen,
    ich hab mir neulich mal Linux auf meinen PC im Geschäft installiert, da ich mich damit einfach mal ein bisschen beschäftigen will.

    Da ich derzeit auch in der Berufsschule C lerne, dachte ich mir das ich mal schnell nen einfaches Programm schreib um mir das kompilieren unter Linux mal anzuschauen.

    Mein Programm frägt einfach nur nach dem Name und dem Alter und gibt das
    Ergebnis dann aus.

    Ich kann auch beide Eingaben machen, wenn er dann aber zur Ausgabe kommt,
    bekomme ich einen "Speicherzugriffsfehler".

    Hier mal bei Programmcode: (unter Windows läuft es).

    #include <stdio.h>
    
    void main()
    {
    char name;
    int alter;
    printf("Name eingeben: ");
    scanf("%s",&name);
    printf("\nAlter eingeben: ");
    scanf("%i",&alter);
    printf("\nName: %s, Alter: %i",name,alter);
    
    }
    


  • Du solltest immer mit -Wall oä. kompilieren und die Warnungen beachten. Das dürfte eigentlich unter Win auch nicht laufen, Du brauchst nämlich einen char-Pointer (bzw. ein char-Array), keinen einzelnen char. Du willst schließlich einen C-String, nicht nur einen einzelnen Buchstaben einlesen.

    Ich verschiebe Dich mal ins C-Forum.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Im guten alten C gibt's explizit keine "Strings", sondern nur Aneinanderreihungen von Chars -> Char-Arrays bzw. sogenannte Char-Pointer. Die wiederrum zeigen auf eine Stelle im Speicher, an der ein vermeintliches Char-Array beginnt und dann wäre es auch praktisch zu wissen, wie lang dieser "String" ist, bzw. wieviele Char-Bereiche in Folge ab dem Zeiger belegt sind / sein sollen...

    Oder so ähnlich 🙂 Bin ja selbst Anfänger.

    Nichtsdestotrotz kannst Du in ein => char name; ganz genau 1(einen) Buchstaben abspeichern.

    Wenn Du einen => char * pname; Char-Pointer nimmst, sagst Du nur, wo der erste Buchstabe des Namens gespeichert wird und - mit etwas Glück - sucht sich Dein Programm dann den entsprechend benötigten zusammenhängenden Speicherplatz aus.

    Sinnvoller wäre es womöglich, festzulegen, dass ein Name maximal 30 Zeichen haben darf.
    Dann kannst Du ein Char-Array deklarieren => char arrname[31];

    Wieso jetzt 31? Auf den ersten Buchstaben in diesem Array greifst Du mit arrname[0] zu. Auf den 30. Buchstaben (zähl ruhig durch, ist wirklich wahr ;P) dann mit arrname[29]. arrname[30] sollte - wie jeder "String" in ANSI-C dann '\0' bzw 0 oder '\000' zugewiesen bekommen. Das ist der "String-Delimiter" und bedeutet in C, dass eine jede vorgegebene "String-Funktion" bei diesem 0 die Verarbeitung des Strings beendet. Andernfalls würden unerwünschte Speicherbereiche berührt werden und Kauderwelsch enstehen.



  • Nubie schrieb:

    Wenn Du einen => char * pname; Char-Pointer nimmst, sagst Du nur, wo der erste Buchstabe des Namens gespeichert wird und - mit etwas Glück - sucht sich Dein Programm dann den entsprechend benötigten zusammenhängenden Speicherplatz aus.

    Ja und der liegt dann irgendwo im Datennirvana (weil kein Speicher reserviert wurde) und der Zugriff darauf per scanf verursacht einen Segfault, der sich gewaschen hat. 🙂



  • lieber einen sauberen Segfault als einen dirty workaround ;P


Log in to reply