Speicherzugriffsverletzung durch Array???
-
Hallo zusammen,
habe ein kleines Problem mit folgender Konsolenanwendung welche mir das Alter
einer Person in Jahren, Monaten und Tagen in einer Konsole anzeigen soll.Nun mein Problem. Wenn ich es so wie folgt compiliere, kommt beim Start die
Fehlermeldung einer Speicher zugriffsverletzung (der Vorgang written konnte nicht
auf den Speicher ausgefuehrt werden).#include <iostream> #include <ctime> using namespace std; int main(int argc, char *argv[]) { //einen Zeiger auf eine Variable vom Structurtyp tm anlegen struct tm *nicos_gebdat = 0; struct tm *heute=0; time_t jetzt; int monatstage[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int alter_in_jahren=0; int alter_in_monaten=0; int alter_in_tagen=0; //nicos gebursdatum und Zeit festlegen 23.11.2003 16:09 Uhr nicos_gebdat->tm_mday = 23; nicos_gebdat->tm_mon = 11-1; //die Monate werden in Monaten seit Januar angegeben also von 0 bis 11 nicos_gebdat->tm_year = 2003-1900; nicos_gebdat->tm_hour = 16; nicos_gebdat->tm_min = 9; nicos_gebdat->tm_sec = 0; nicos_gebdat->tm_isdst = 0; time(&jetzt); heute = localtime(&jetzt); //Jahresberechnung if(nicos_gebdat->tm_mon >= heute->tm_mon && nicos_gebdat->tm_mday >= heute->tm_mday) { alter_in_jahren = (heute->tm_year + 1900) - (nicos_gebdat->tm_year + 1900); } else { alter_in_jahren = ((heute->tm_year + 1900) - 1) - (nicos_gebdat->tm_year + 1900); } //Monatsberechnung + Tagesberechnung if(heute->tm_mday >= nicos_gebdat->tm_mday) { alter_in_monaten = (12 - (nicos_gebdat->tm_mon + 1)) + (heute->tm_mon + 1); alter_in_tagen = heute->tm_mday - nicos_gebdat->tm_mday; } else { alter_in_monaten = (12 - (nicos_gebdat->tm_mon + 1)) + ((heute->tm_mon + 1) - 1); alter_in_tagen = monatstage[heute->tm_mon - 1] - nicos_gebdat->tm_mday + heute->tm_mday; } cout << alter_in_jahren << " Jahre\n"; cout << alter_in_monaten << " Monate\n"; cout << alter_in_tagen << " Tage"; cin.get(); return 0; }
Kommentiere ich aber die Zeile mit
//int monatstage[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //alter_in_tagen = monatstage[heute->tm_mon - 1] - nicos_gebdat->tm_mday + heute->tm_mday;
und die Zeile wo das Array genutzt wird aus, dann bleibt auch die Zugriffsverletzung
aus.Hat jemand eine Idee?
-
haderlump22 schrieb:
nicos_gebdat->tm_mday = 23;
Es sollte hier schon abstürzen, weil nicos_gebdat ein Nullpointer ist.
-
Bashar schrieb:
haderlump22 schrieb:
nicos_gebdat->tm_mday = 23;
Es sollte hier schon abstürzen, weil nicos_gebdat ein Nullpointer ist.
das = 0 hinter den tm Zeigern stand bei meinen Versuchen eigentlich nicht
da. Das ist bei meinen basteleien mit hineingekommen.Da sollte eigentlich
struct tm *nicos_gebdat; struct tm *heute;
stehen. Der Fehler ist aber der selbe.
Sorry habe mir den Quelltext nicht richtig angesehen bevor ich
gepostet habe.
-
Dann ist es halt ein uninitialisierter Zeiger, das ist genauso schlimm (nur etwas unregelmäßiger.)
-
Bashar schrieb:
Dann ist es halt ein uninitialisierter Zeiger, das ist genauso schlimm (nur etwas unregelmäßiger.)
unregelmäigkeiten in einem programm sind schlimmer, da sie hard to find sind, im g2egensatz zum 0 pointer, da wird ne access violation geworfen, und gut is^^
-
Ich glaube ich werde einfach mal versuchen das Programm ganz ohne Zeiger
zum laufen zu bekommen.
Eventuell funzt es ja dann.
-
Ganz ohne wirds nicht gehen, weil localtime einen Zeiger zurückgibt, aber nicos_gebdat sollte in der Tat einfach ein tm sein.
BTW Der Typ heißt in C++ tm. Es ist nicht notwendig, struct tm zu schreiben.