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.


Anmelden zum Antworten