Mit Dev-C++ erzeugtes Programm stürzt ab...
-
TelegrammTyp *telegramm = malloc(sizeof(struct TelegrammTyp));
ah gelöst.. konntet ihr wohl nich wissen
weil TelegrammTyp is getypdeftes structTelegrammTyp *telegramm = malloc(sizeof(TelegrammTyp));
die frage stellt sich nun warum muss ich bei *char nix allozieren?
-
daß es unter unix geht liegt vielleicht daran, daß unter vielen unixen mW ein prozess beim start immer so ziemlich den gesamten adsressraum zugewiesen bekommt. ein zugriff auf eine zufällige addresse führt dann meistens nicht zu einem absturz sondern zur zuweisung einer speicherpage an der addresse.
-
dt2158 schrieb:
die frage stellt sich nun warum muss ich bei *char nix allozieren?
Du meinst das hier?
char *text;
Nun, eigentlich musst du dafür auch einen gültigen Speicherbereich zur Verfügung stellen. Da text im weiteren Verlauf aber nicht genutzt wird, ist es erstmal egal, dass der Zeiger ins Nirvana zeigt.
Du kannst allerdings auch direkt Text zuweisen, wie zB hiertelegramm->logtext = "test";
"test" ist ein sogenanntes String Literal und dieses ist während der gesamten Laufzeit gültig. Das Problem dabei ist allerdings, und darauf wollte auch Caipi hinweisen, dass dieses Literal read-only ist. Und wenn die zugewiesene Variable vom Typ char* ist, dann ist das eine Fehlerquelle. In C++ wird das sogar als "deprecated" eingestuft, iirc. Ob das in C genauso ist, kann ich dir im Moment allerdings nicht sagen. Fakt ist, dass eine solche Variable dann besser vom Typ const char* ist. Oder du stellst halt genügend Speicher zur Verfügung, um eine Kopie des Strings zu halten, zB
char text[100] = "test"; // Platz für 100 Zeichen inklusive '\0', wird mit "test" initialisiert
Dieses Zeichenarray kannst du dann jederzeit ändern.
Und noch was, wenn du dynamisch Speicher reservierst (malloc), dann musst du den nach Benutzung auch wieder freigeben. Ansonsten bist du gleich beim nächsten Problem, Speicherlecks. Die Speicherfreigabe erledigst du mit der Funktion free. Wenn du telegramm also nicht mehr brauchst, dann fügst du folgende Zeile in dein Programm ein
free(telegramm);
Und bedenke, danach zeigt der Zeiger wieder ins Nirvana.
-
@Konfusius: Eher nicht... es gibt immerhin Segmentation Violations und die sind ganz einfach Zugriffe auf nicht existierenden Speicher.
Der OP hat ganz einfach zu viel Glueck.Wer probleme mit Pointern hat:
- Pointer immer mit NULL initialisieren, dann bleiben Fehler nicht laenger unentdeckt
- zu jedem benutzten Cast muss eine gute Begruendung her. Laesst sich keine finden, ist der Cast womoeglich ein Fehler.
-
hab einfach ma ergänzt, so sollte es dann doch safe sein wa?
telegramm->logtext = malloc(50*sizeof(char)); telegramm->logtext = "test";
-
Nein, deswegen ist "test" immer noch ein String-Literal (und außerdem hast du dort ein gewaltuges Speicherleck) - zum Kopieren von Zeichenketten verwendet C strcpy (oder memcpy).
-
dt2158 schrieb:
hab einfach ma ergänzt, so sollte es dann doch safe sein wa?
telegramm->logtext = malloc(50*sizeof(char)); telegramm->logtext = "test";
Ganz und gar nicht. Schlimmer. Du reservierst hier für
telegramm->logtext 50 Zeichen. Dann weist du telegramm->logtext ein stringliteral zu. Jetzt hast du keinen Zugriff mehr auf die angeforderten 50 chars -> Speicherleck.
so ist's richtigtelegramm->logtext = malloc(50*sizeof(char)); strcpy(telegramm->logtext ,"test");
Kurt
Edit: bin ein bissl langsam heute
-
ich muss sagen ich versteh es nich, wenn ich den string telegramm->logtext zuweise, denn is das nen unterschiedlicher adressbereich, als der den ich alozziert hab, versteh ich dat richtig???
-
Ich Denke du verstehst den Unterschied zwichen pointer und array nicht.
telegramm->logtext = "test"; // weist dem pointer auf char telegramm->logtext die adresse des stringliterals "test" zu
strcpy(telegramm->logtext ,"test"); kopiert "test" in das char array telegramm->logtext
-
ich glaube, es wird zeit fuer GRUNDLAGEN:
http://www.pronix.de/pronix-4.html