• Hallo, ich lerne zurzeit C und bin dabei etwas zu testen, um es später in mein Programm, was ich für meinen Kurs im Studium programmiern muss, einzubauen.

    int main () {

    int i;

    typedef struct Einkunde {
    int id;
    char name[128];
    char vorname[128];
    } Kunde;

    Kunde meineKunden[100];

    for (i=0; i<100; i++) {
    printf("KundenID für Kunden %d eingeben: ", i);
    scanf("%d", meineKunden[i].id);
    printf("Nachname eingeben: ");
    scanf("%s", meineKunden[i].name);
    printf("Vorname eingeben: ");
    scanf("%s", meineKunden[i].vorname);
    }
    return 0;
    }

    Das compilieren funktioniert ohne Probleme.
    Ich würde gerne wissen wieso ich diese "segmentation fault(core dumped) Fehlermeldung bekomme, nachdem ich die KundenID eingebe?
    Laut meinen Vorgaben, habe ich das so geschrieben. Ich habe es nach paar kleineren Änderungen zum Laufen bekommen, nach weiteren Änderungen lief es wieder nicht. Blöderweise habe ich die Version, wo es funktioniert hat überschrieben.
    In diesem Zustand soll das nicht zu meinem Programm hinzugefügt werden, dies dient nur zu Testzwecken.

    Danke

  • Die Zeile

    Code
    scanf("%d", meineKunden[i].id);


    muss richtigerweise so lauten:

    Code
    scanf("%d", [B]&[/B]meineKunden[i].id);

    scanf erwartet als zweiten Parameter die Adresse einer Variablen, wo der eingelesene Wert hingeschrieben wird. Du übergibst stattdessen den Wert der (uninitialisierten) Variablen id selbst. scanf versucht dann an eine Stelle im Speicher zu schreiben, die nicht für dein Programm reserviert ist.

    Die anderen beiden scanf-Zeilen sind übrigens richtig, weil name und vorname Arrays sind, und meineKunden[i].name bzw. meineKunden[i].vorname automatisch die Adresse des ersten Elements bezeichnen (alternativ wäre &meineKunden[i].name[0] und &meineKunden[i].vorname[0] auch möglich).

  • Der Grund ist, dass du bei

    Code
    [COLOR=#333333]scanf("%d", meineKunden[i].id);[/COLOR]

    die Funktion scanf eine Integer setzen lässt. Eine Funktion kann aber nur eine Variable setzen, wenn Sie die Referenz auf den Speicherbereich hat.
    Bei name und vorname funktioniert es deshalb, weil Arrays (in diesem Fall char[]) nichts anderes als Pointer sind (char*).
    Damit dein Beispiel funktioniert, muss du einfach nur die Adresse von meinkunde[i].id übergeben, anstatt den Wert der Variable:

    Code
    [COLOR=#333333]scanf("%d", &meineKunden[i].id);[/COLOR]

    Edit: Christoph war schneller :(

    Privacy

    TI, SE-Student - Software/Hardware Engineer

    Einmal editiert, zuletzt von Privacy (25. November 2013 um 15:20)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!