Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Speicherzugriffsfehler

  1. #1
    Sabutay
    Gast

    Speicherzugriffsfehler

    Hallo
    Hab erst neu angefangen mit c zu programmieren.Dafür verwende ich den buch von erlenkötter.
    Ich arbeite unter Ubuntu Linux, und als editor verwende ich vim. Den unteren code kompilire ich mit dieser zeile:

    Code:
    gcc -o bsp10018 bsp10018.c
    Aber wenn ich es dann ausführe, und dann zum beispiel den jahr 2001 schreibe kommt dieses fehler

    Speicherzugriffsfehler

    Ich weiss auch net warum das passirt.Es passiert mir zum ersten mal.
    Danke im vorraus.
    Sabutay

    Code:
    #include <stdio.h>
    
    main(){
    		int jahr,monat,tage;
    		printf("\n\t Kalender\n");
    		printf("\nJahr schreiben:");
    		scanf("%i",jahr);
    		printf("\nMonat schreiben :");
    		scanf("%i",monat);
    		if (monat >= 1 && monat <= 12 && jahr > 1582){
    				switch (monat) {
    						case 2:
    								if (!((jahr%100)%4) && (jahr%100)
    												|| !(jahr%400))
    										tage = 29;
    								else
    										tage = 28;
    								break;
    						case 2*2:
    						case 6:
    						case 9: case 11:
    								tage = 30;
    								break;
    						default:
    								tage = 31;
    				}
    				printf("\n%i hat der Monat %i %i tage",jahr,monat,tage);
    		}
    		else 
    				printf("\n Falsche Eingaben ");
    }

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    scanf("%i", jahr);

    geht so nicht - damit das funktioniert muss es

    scanf("%i", &jahr);

    heissen. Wieso das? Der Grund ist folgender (steht sicher auch irgendwo in deinem Buch ):
    Wenn du ein Argument an eine Funktion übergibst - wie z.B. bei einem
    scanf("%i", jahr) die int-Variable Jahr dann ist innerhalb der Funktion scanf() eine Kopie auf dem Stack des Inhalts der Variable jahr die du da hast verfügbar.

    Wenn nun innerhalb von scanf() der Inhalt des dortigen jahr geändert wird dann nützt dir das nichts weil diese jahr am Ende der scanf-Funktion verworfen wird.

    Damit scanf() die Variable ändern kann muss es wissen wo im Speicher des Programms dein jahr das du in der Funktion main angelegt hast liegt. Das geht indem du scanf() die Adresse deines jahr übergibst - also &jahr.

    Zum Speicherzugriffsfehler kommts hier weil die Int-Variable jahr auch als eine Adresse interpretiert werden kann (C ist halt nicht sehr typsicher ) - scanf versucht also vermutlich an irgend eine Adresse zu schreiben die in einem nicht brauchbaren Speicherbereich liegt - entsprechend dann der Segfault weil man dort nicht schreiben darf (z.B. weils der Teil des Speichers ist wo der Programmcode abgelegt ist - und der ist auf der Festplatte und kann so nicht geändert werden)

    Ausserdem solltest du (in einem realen nicht-Übungsprogramm) auch etwas besser gucken dass du eventuelle Probleme mit dem Einlesen abfängst (also den Rückgabewert von scanf() überprüfen) - dann kannst du gleich noch mal nachfragen wenn etwas nicht stimmt mit der eingegebenen Jahrzahl anstatt einfach am Ende zu sagen: Da lief was falsch.

    MfG Peschmä
    Geändert von peschmae (22-09-2005 um 20:44 Uhr)
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Sabutay
    Gast
    Danke für den tip.Es hat tadenlos funktionert.Werde naechstes mal mehr darauf achten.

    Mfg
    Sabutay

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Da ist das Problem:
    Code:
    gcc -o bsp10018 bsp10018.c
    Hättest du mit
    Code:
    gcc -Wall -o bsp10018 bsp10018.c
    übersetzt, hätte dir der compiler gemeldet das da was mit den Typen nicht stimmt, als Warnung.

    Das wär Lektion 1: Immer alle Compiler-Warungen erst nehmen. (Mach dir nichts draus, ich hatte kürzlich ein kommerzielles Programm mit -Wall übersetzt und musste mehrere hundert Warnungen entfernen also lieber gleich von Anfang richtig!)

    Gruss, Andy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •