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