KERN_PROTECTION_FAILURE



  • Hallo habe gerade ein C-prog programmiert.Da der Code sehr lang ist gebe ich mal ne kurze Zusammenfassung:

    -zwei Matrizen dynamisch erzeugt(Multizeiger) und Speicher reserviert ueber malloc
    -kann Werte in die Matrix schreiben
    - kann die kompletten beiden MAtrizen ausgeben

    Hier die Deklaration der Elemente:

    double** alloc_mat(int* m, int* n )
    {
    	int i;
    
    	double** mat=(double **)malloc((*m)*sizeof(double*));
    
        for (i=0;i<*n;i++)
            (mat[i]=(double*)malloc((*n)*sizeof(double)));
    
    	return mat;
    
    }
    	double** Ab = alloc_mat(m, m);
    	double** An = alloc_mat(m, k);
    double temp2,temp3;
    

    so und jetzt kommt dieser code:

    for(j=0; j<*m;j++)
    	{		for(i=0;i<*m;i++)
    	{
    		printf("%lf ",Ab[j][i]);
    	}
    		printf("\n");
    	}
    		for(j=0; j<*m;j++)
    	{		for(i=0;i<*k;i++)
    	{
    		printf("%lf ",An[j][i]);
    	}
    		printf("\n");
    	}
    //bis hier funktioniert die Ausgabe, dann im folgenden der segmentation fault
    	for(i=0; i<*m; i++)
    	{
    
    			temp2 = Ab[i][r];
    			temp3 = -An[i][s];
    
    			//....
    		}
    

    hier gibt mir der gdb folgende meldung aus

    Program received signal EXC_BAD_ACCESS, Could not access memory.
    Reason: KERN_INVALID_ADDRESS at address: 0xfffffff8
    0x00002abf in revsimplex (An=0x100160, N=0x1003e0, B=0x1003d0, b=0x100370, c=0x100390, m=0x100120, n=0x100140, p=0x100150) at newfunctions.h:537
    537 temp2=Ab[i][r];

    Ich bin C Anfaenger.Also gebe ich mal weitere Informationen die mir aufgefallen sind:
    -ändere ich die Schleife, in der der Segmentation fault kommt, auf i<*(m-1), kommt kein Fehler, obwohl ich die komplette Matrix ausgeben kann...

    Das ist fuer mich einfach total unlogisch...
    Sehe echt kein Land mehr 😞

    p.s. ganzer Code hochgeladen
    http://rapidshare.com/files/226012775/Archiv.zip.html
    Fehler ist in Funktion revsimplex



  • Ich hab mir den kompletten Code nicht angeschaut und weiß deshalb nicht, was m, k, r und s sind, aber auffällig ist, dass die Schleife in alloc_mat bis <*n zählt, obwohl sie bis <*m zählen sollte.

    Außerdem (obwohl keine Fehler):
    - den Rückgabewert von malloc braucht und sollte man nicht casten
    - warum übergibst du m und n als Zeiger an alloc_mat?
    - bei printf ist das 'l' in %lf nutzlos, doubles gibt man einfach mit %f aus.



  • - ja hast recht ist nen Fehler in alloc_mat.Ist bisher nicht aufgefallen da m und n bisher wohl immer gleich waren.

    -wieso sollte ich sie nicht als zeiger uebergeben?hat das nen nachteil?ist doch im Prinzip egal

    -was casten heisst weiss ich nicht ^^

    Dank dir



  • mrtn++ schrieb:

    -wieso sollte ich sie nicht als zeiger uebergeben?hat das nen nachteil?ist doch im Prinzip egal

    Du kannst es natürlich machen, aber es macht nur Sinn, wenn man die Werte in der Funktion verändern will, oder wenn es um "große" Objekte wie Strukturen geht, die man nicht unnötig kopieren will.

    Ansonsten ist es unüblich und verkompliziert nur den Code. Und es verwirrt andere Programmierer, die das Programm verstehen wollen, weil sie dann denken, es hätte einen tieferen Sinn. Vielleicht ist es auch etwas langsamer.

    -was casten heisst weiss ich nicht ^^

    Explizites Typumwandeln, z.B. von void* (geliefert von malloc) zu double**. Die Typumwandlung wird in dem Fall implizit gemacht, d.h. du kannst einfach

    double** mat = malloc(*m * sizeof(double*));
    

    schreiben, oder wenn du willst auch

    double** mat = malloc(*m * sizeof *mat);
    

    (allerdings ist das in C++ anders; wenn sich dein Compiler beschwert, läuft er wahrscheinlich irrtümlich im C++-Modus oder so)



  • namespace invader schrieb:

    mrtn++ schrieb:

    -wieso sollte ich sie nicht als zeiger uebergeben?hat das nen nachteil?ist doch im Prinzip egal

    Du kannst es natürlich machen, aber es macht nur Sinn, wenn man die Werte in der Funktion verändern will, oder wenn es um "große" Objekte wie Strukturen geht, die man nicht unnötig kopieren will.

    Ansonsten ist es unüblich und verkompliziert nur den Code. Und es verwirrt andere Programmierer, die das Programm verstehen wollen, weil sie dann denken, es hätte einen tieferen Sinn.

    [...]

    (allerdings ist das in C++ anders; wenn sich dein Compiler beschwert, läuft er wahrscheinlich irrtümlich im C++-Modus oder so)

    Es hat dann seinen Platz, wenn man C und C++ mischt (einer meiner Unsitten). Der C-Compiler beschwert sich nicht ueber den ueberfluessige cast und der C++-Compiler ist auch gluecklich ...



  • Der menschliche Leser eines C-Programms ärgert sich aber über malloc-casts :p

    Und es kann nützliche Compilerwarnungen verhindern.

    Zum Mischen von C und C++ ist der Linker da, dann müssen höchstens Headerdateien aus C/C++-Schnittmengencode bestehen.


Anmelden zum Antworten