Speicherzugriffsfehler nachdem Programm durchgelaufen ist



  • lalas schrieb:

    das void* vMem meinte unser dozent müsse so sein, weil realloc ein void* übergeben habe möchte als ersten parameter.
    wie ich dazu einen int addieren kann ist mir auch schleierhaft, aber laut dozent sollen wir das so schreiben.

    Wenn ich diesen "Dozenten" erwisch... 😡

    In C kann jeder Pointertyp implizit nach void* umgewandelt werden. Ein void -Pointer ist ein Pointer, von dem der Compiler keine Ahnung hat, welche Art Element (Typ) dahintersteckt. Somit ist Pointerarithmetik mit void -Pointern ein Ratespiel.

    lalas schrieb:

    ich würde das ganze ja gerne umschreiben, nur ist mir nicht so ganz klar wie ich das anders stricken kann.

    Mir auch nicht. Deine (seine) StrLstEingabeKompakt( ) ist mir auch spanisch, da 1. (wie schon erwähnt) das realloc( ) herzlich wenig bringt, wenn man die neue Adresse wegwirft und 2. die Adressen der jeweiligen Tokens nicht im Array acListe landen.

    lalas schrieb:

    nByteNeu=strlen(szPuffer)+1 müsste doch den speicherbedarf als int in nByteNeu schreiben, oder ?

    ? Was meinst Du damit? Für Speichergrößen sollte man eigentlich den Typ size_t verwenden ( - deine Funktionen sollten statt Integern auch size_t verwenden und zurückgeben).

    Vielleicht hilft dir das:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_ITEMS 100
    
    size_t StrLstEingabeKompakt( char *list[ ], size_t max_items )
    {
    	char input[ 200 ];
    	char *data = 0;
    	size_t data_size = 0;
    	size_t input_length = 0;
    	size_t i = 0;
    
    	for( ; i < max_items; ++i ) {
    
    		fgets( input, 200, stdin );
    
    		if( !strcmp( input, "#\n" ) ) {
    
    			break;
    		}
    
    		data = realloc( data, data_size + ( input_length = strlen( input ) + 1 ) );
    		strcpy( data + data_size, input );
    		list[ i ] = data + data_size;
    		data_size += input_length;
    	}
    
    	return i;
    }
    
    void StrLstAusgabe( char* list[], size_t num_items )
    {
    	size_t i = 0;
    
    	for( ; i < num_items; ++i ) {
    
            // fgets( ) liest das newline mit ein. Ausgabe mit puts( ) wär' hässlich ;)
    		printf( list[ i ] );
    	}
    }
    
    int main( )
    {
    	char *list[ MAX_ITEMS ];
    	size_t num_items = StrLstEingabeKompakt( list, MAX_ITEMS );
    	StrLstAusgabe( list, num_items );
    	free( list[ 0 ] );
    }
    

    cheers, Swordfish

    PS: void* castet man nicht.



  • spitze, das hat mir echt geholfen...danke euch allen.

    habe den code jetzt soweit (fast) fertig und es funktioniert alles. muss nun nur noch sortieralgorithmen einbauen und fertig.

    was ich allerdings noch immer nicht begriffen habe ist das mit dem free()

    was muss ich genau nach dem aufruf von malloc, realloc, etc. genau machen ? einfach am ende der funktion free() schreiben oder noch irgendwelche parameter mit angeben ?



  • free nimmt void-Zeiger als einzigen Parameter (siehe Swordfish -- auch der hat hin und wieder recht).



  • gccsucks-freak schrieb:

    wie bitte??? nimmt er das als 'char*' an?

    Bin leider ein wenig betrunken, trotzdem folgendes:

    int main(int ac, char **av)
    {
        char buf[32] = {'0', '1', '2', '3', '4', 0};
        void *v = buf;
    
        v += 1;
    
        printf("%d %d %d\n", v, v+1, v+2);
    
        return 0;
    }
    

    Kompiliert mit dem GCC ohne Probleme und gibt drei aufeinanderfolgende Ganzzahlen aus. Ist das standard-konform?



  • #include <stdio.h>
    
    int main(int ac, char **av)
    {
        char buf[32] = {'0', '1', '2', '3', '4', 0};
        void *v = buf;
    
        v += 1;
    
        printf("%c\n", *(char*)v);
    
        return 0;
    }
    

    Gibt aus: 1



  • gnu-flamer schrieb:

    ...Ist das standard-konform?

    niemals. bei *void v; v += 1; geht das +=1 nicht.
    🙂



  • free-flamer schrieb:

    (siehe Swordfish -- auch der hat hin und wieder recht).

    😃

    cheers, Swordfish



  • Swordfish schrieb:

    free-flamer schrieb:

    (siehe Swordfish -- auch der hat hin und wieder recht).

    😃

    na, da freut sich unser kleines fischlein aber.
    🙂



  • fish'n'chips-freak schrieb:

    na, da freut sich unser kleines fischlein aber.
    🙂

    Ja ... *freu* 🙄

    cheers, Swordfish



  • na, da freut sich unser kleines fischlein aber.

    Dann werd ich ihn gleich ein wenig betrüben, damit wir's nicht zu gemütlich haben.
    🙂

    Thou shall not fflush stdin!
    Thou shall not cast void pointers! And therefore
    Thou shall not cast the result of malloc!

    Dein C-Code war gut, aber da drin ist noch ein Syntaxfehler zu töten. Ich sag's mit Shakespeare:

    So shalt thou feed on Death, that feeds on men,
    and, Death once dead, there's no more dying then.



  • syntax-flamer schrieb:

    [...] aber da drin ist noch ein Syntaxfehler zu töten.

    glaub' ich nicht.

    cheers, Swordfish



  • glaub' ich nicht.

    <offtopic>
    Warum nicht?
    </offtopic>


Anmelden zum Antworten