segmentation fault



  • Moh schrieb:

    einfach mit:

    free( *data[ element_x ] );
    

    Nein! Damit würdest du ja data[ element_x ] dereferenzieren.
    [edit]
    ...damit würdest du versuchen den Speicher freizugeben, dessen Adresse an data[element_x][0] steht, und das gibt ganz großen Käse 😉
    [/edit]

    Moh schrieb:

    und noch einmal zur sicherheit, wenn ich schreibe:

    free( data[ element_x ] );
    

    dann gebe ich den speicher frei, auf den die adresse zeigt, oder?

    Jup.

    Ein kleines Beispiel:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define NUM_STRINGS 10
    
    int main( )
    {
        const char *map[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
    
        char **string_array = ( char** ) malloc( NUM_STRINGS * sizeof( char* ) );
    
        for( int i = 0; i < NUM_STRINGS; ++i ) {
    
            string_array[ i ] = ( char* ) malloc( strlen( map[ i ] ) + 1 ); // 1)
            strcpy( string_array[ i ], map[ i ] );
        }
    
        for( int i = 0; i < NUM_STRINGS; ++i )
            printf( "%s\n", string_array[ i ] );
    
        // Aufräumen:
    
        for( int i = 0; i < NUM_STRINGS; ++i )
            free( string_array[ i ] ); // den bei 1) reservierten Speicher für die Strings freigeben
    
        free( string_array ); // das Array aus NUM_STRINGS aus Zeigern auf char* freigeben
    }
    

    Greetz, Swordfish



  • aehm okay, dein post ist mehr verwirrend als dass er mir hilft...

    data = malloc( ANZAHL_DER_ELEMENTE * sizeof( data* ) )

    warum muss es so lauten? das geht doch gar nicht, schon allein rein logisch... oder bin ich da jetzt vollkommen auf dem falschen weg?

    wenn ich habe:

    struct irgendwas **data;
    

    dann speicher fuer die pointer reserviere:

    data = malloc(ANZ_POINTER * sizeof(*data));
    

    wie gebe ich den speicher, den die pointer einnehmen, konnkret wieder frei?



  • Swordfish schrieb:

    Moh schrieb:

    data = malloc(ANZAHL_DER_ELEMENTE * sizeof(*data));
    

    muss

    data = malloc( ANZAHL_DER_ELEMENTE * sizeof( data* ) );
    

    heißen.

    Ähmmm, nein.



  • @TactX: Oh, shit! Tschuldige. Ahhh. Er dereferenziert data einmal... ich hab' zu schnell gelesen und gedacht, data sei ein Typ. Mann bin ich blöd.

    Greetz, Swordfish



  • Swordfish schrieb:

    @TactX: Oh, shit! Tschuldige. Ahhh. Er dereferenziert data einmal... ich hab' zu schnell gelesen und gedacht, data sei ein Typ. Mann bin ich blöd.

    Jetzt sei nicht so hart zu dir 🙂

    PS: Warum castest du eigentlich malloc()? 😉



  • Moh schrieb:

    data = malloc(ANZ_POINTER * sizeof(*data));
    

    wie gebe ich den speicher, den die pointer einnehmen, konnkret wieder frei?

    mit:

    for( int i = 0; i < ANZ_POINTER; ++i )
        free( data[ i ] );
    free( data );
    

    Das sollte dir eigentlich mein Beispiel (oben) erklären.

    BTW, @TactX: Findest du meinen Post auch so verwirrend!? (Ich mein, abgesehen von den ehemals dagewesenen Fehlern?)

    TactX schrieb:

    Jetzt sei nicht so hart zu dir 🙂

    ne, verstehst, da beginnt man, an Fraktale (Terrains, Bäume, Gräser...) und Neurale Netze zu denken und dann sowas, nene... 😡

    TactX schrieb:

    Warum castest du eigentlich malloc()? 😉

    Ich liieebe Casts! 😉 Nee, will mein MSVS 2003 .net so.

    Greetz, Swordfish



  • TactX schrieb:

    PS: Warum castest du eigentlich malloc()? 😉

    damit sein c++ compiler das schluckt 😃



  • Swordfish schrieb:

    TactX schrieb:

    Warum castest du eigentlich malloc()? 😉

    Ich liieebe Casts! 😉 Nee, will mein MSVS 2003 .net so.

    du musst die dateien .c nenen, das könnte ihn milde stimmen...



  • Swordfish schrieb:

    BTW, @TactX: Findest du meinen Post auch so verwirrend!? (Ich mein, abgesehen von den ehemals dagewesenen Fehlern?)

    Nö. Aber mir erst durch diesen Hinweis bewusst geworden, dass Moh bereits geantwortet hat 😃



  • damit sein c++ compiler das schluckt 😃

    AAhhrrgll (ich druck's grad aus -> Wallpaper... 😃 )

    Greetz, Swordfish


Anmelden zum Antworten