PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherzugriffsfehler



Sabutay
22-09-2005, 18:52
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:


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


#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 ");
}

peschmae
22-09-2005, 19:36
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ä

Sabutay
22-09-2005, 20:38
Danke für den tip.Es hat tadenlos funktionert.Werde naechstes mal mehr darauf achten.

Mfg
Sabutay

RapidMax
23-09-2005, 21:52
Da ist das Problem:

gcc -o bsp10018 bsp10018.c
Hättest du mit

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 :eek: also lieber gleich von Anfang richtig!)

Gruss, Andy