C - Dynamische Speicherverwaltung |
13.10.2016, 18:50 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | C - Dynamische Speicherverwaltung Guten Abend, ich sitze derzeit bei einem Programm, welches mittels dynamischer Speicherverwaltung einen String vergrößern und Zeichen anfügen soll. Das Programm sieht wie folgt aus:
Im Fall dass die Zeile mit dem strcpy(str, "0") auskommentiert ist, erhalten ich einen Segmentation fault. Welcher Schritt fehlt, dass die Variable, welche ich über malloc() angelegt habe, verwendet werden kann? Edit: Habe den Fehler gefunden! er lag an dem Code, den man hier nicht sehen kann. Zunächst habe ich nur in einer Online-Konsole entwickelt und den Fehler "segmentation fault" bekommen; als ich dann auf die IDE gewechselt bin wurde er mit "pointer being realloc'd was not allocated" schon etwas genauer. Folgend die Methode die den Fehler enthielt und die if-Anweisung die gefehlt hat
Mit freundlichen Grüßen InformaTiger |
||||||||||
|
|||||||||||
14.10.2016, 18:13 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Hallo Informatiger, Du hast einen typischen Anfängerfehler in C gemacht. "0" ist zwei Zeichen lang! Das liegt daran, dass ein String immer mit '\0' abgeschlossen werden muss, wohl gemerkt nicht '0'. Wenn Du den String mit "" angibst wird das implizit mit gemacht. Ein String ist in C nichts anderes als ein Char-Array, welches als Begrenzung mit 0 abgeschlossen wird. s. Nullterminierung. Gruß, Karlito |
||||||||||
25.10.2016, 18:57 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Anderer Tag - ähnliches Problem: ich schreibe eine Funktion welche mir aus einer Datei alle Zeilen schrittweise (mit angegebener Buffergröße) in einen String bzw. in ein Char-Array schreiben soll. Die Funktion macht ihre Aufgabe, das Problem ist, ich verstehe nicht warum. Sie sollte meiner Meinung nach, nach dem ersten Durchlauf durch die Schleife mit einem Fehler abbrechen. Ich schreibe eigentlich außerhalb des Speicherbereiches raus
Wenn meine Annahme stimmt und C das nur aus irgendeinem unerdenklichen Grund macht, müsste ich content in der Schleife jedes mal realloziieren. Welche Funktion soll ich dafür verwenden? sizeof(content) oder strlen(content). Die Rechnung müsste realloc(content, funktion(content) + buffer_size) lauten... Mit freundlichen Grüßen informaTiger |
||||||||||
28.10.2016, 20:47 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Hallo Informatiger, in C wird das überschreiten von Arrays nicht geprüft. Das musst Du selbst machen. Das Schreiben über das Array hinaus kann recht lange gut gehen. Ich vermute, dass spätestens dann, wenn Du >4Kb schreibst, das Betriebssystem schreit, weil Du die aktuelle Seite verlässt und dann keine Berechtigung mehr hast. Früher konnte soetwas in der Art für Pufferüberläuft genutzt werden. Heute ist das weit schwerer. Bitte auch beachten, dass dir sizeof nur die Größe des Datentyps zurückgibt. Wenn Du das auf einen "String" anwenderst bekommst Du wahrscheinlich 8 zurück, weil Du einen Pointer au das erste Element des Char-Arrays übergibst. 64bit = 8 Byte -> sizeof(char *) = 8. Gruß, Karlito |
||||||||||
Anzeige | |||||||||||
|
|