actionbrowser.com
Entweder du allokierst einen sehr großen Bereich und kopierst es auf einen passenden Bereich um, oder du musst alles selber machen. Wenn du alles selber machen möchtest, musst du jeden Tasteneingabe (z. B. mit getc) auslesen, in einen allozierten Speicher schreiben, und diesen dann um einen vergrößern (reallozieren, bzw eine verkettete Liste). Solange bis Enter oder so gedrückt wird. Dann würde der Speicherbereich dynamisch mitwachsen. Aus Performancegründen, ist das aber nicht bei Dateieinlesen sondern eher bei Keyboardeingaben zu empfehlen. Außerdem hast du bei verketteten Listen das Problem, dass du für einen Byte Nutzdaten (das Character), einen 4Byte Pointer benötigst. Verkettet Listen haben natürlich den Vorteil dass der kram im Speicher verteilt sein darf, bei alloc wird immer zusammenhängender Speicher benötigt, sodass realloc unter Umständen umkopieren muss, was bei großen Datenmengen auch inperformant werden dürfte. P. Foren sind kein Echtzeitkommunikationssystem. Rheinwerk Computing :: C von A bis Z – 11.5 Übergabe von Arrays an Funktionen. 8 das war genau die antwort die ich mir erhofft hatte.
Das größte Manko von gets() besteht allerdings darin, daß es keinerlei Schutz gegen das Hinausschreiben über die Array-Grenzen bietet. Deshalb sollte sein Einsatz vermieden und stattdessen die Funktion fgets() verwendet werden. Diese Funktion ist in stdio. h deklariert als char *fgets(char *Ziel, int MaxZeichen, FILE *Eingabestrom) Wie Ihnen vielleicht auffällt, ist fgets() nicht in erste Linie für die Eingabe von der Tastatur konzipiert, sondern kommt mit allen möglichen Eingabequellen zurecht. Wenn fgets() von der Standardeingabe lesen soll, muß das dritte Argument stdin lauten. Das erste Argument ist wieder ein Pointer auf einen Puffer, an dem die eingegebenen Daten abgelegt werden sollen, das zweite Argument hingegen begrenzt die Anzahl der akzeptierten Zeichen. fgets() bricht entweder ab, sobald es ein entdeckt oder MaxZeichen-1 Zeichen eingelesen wurden; wie gets() hängt fgets() noch ' \0 ' ans Ende der Zeichenkette. String einlesen c.r. Im Unterschied zu gets() verwirft es jedoch nicht den abschließenden Zeilenvorschub: Um dessen Enfernung muß sich der Programmierer selbst kümmern (siehe dazu Beispiel fgets.
Wenn ich free benutze wird meine Console mit Fehlermeldungen überflutet: *** glibc detected ***. / free(): invalid next size (fast): 0x0844d008 *** ======= Backtrace: ========= /lib/tls/i686/cmov/(+0x6b591)[0xb76ff591] /lib/tls/i686/cmov/(+0x6cde[0xb7700de8] /lib/tls/i686/cmov/(cfree+0x6d)[0xb7703ecd]. /[0x8048615] /lib/tls/i686/cmov/(__libc_start_main+0xe6)[0xb76aabd6]. /[0x80484a1] ======= Memory map: ======== aber warum wenn ich speicher mit malloc allokiere muss ich diesen doch wieder mit free() Freigeben? Danke im Vorraus für eure Hilfe! #2 Also für dein erstes Problem gäbe es die Lösung, alle Zeichen selbst einzulesen und dynamisch zu allozieren. C Programmieren - "Strings erstellen und einlesen" - YouTube. Ein Beispiel dazu hab ich im Forum schonmal gepostet, hier ein Link zum Post. Zu deinem zweiten Problem habe ich spontan auch keine Lösung, aber es gibt bei der Fehlermeldung ein Haufen Ergebnisse bei Google, evtl. ist da etwas dabei. Einen Fehler sehe ich jedenfalls nicht. Allerdings frage ich mich, warum du fgets verwendest, statt gets, welches sowieso von STDIN liest und zudem eine Prüfung vor Pufferüberlauf drin hat.
Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an.
ich sehe nun dass es nicht sehr effizient ist pro zeichen einen pointer anzulegen der auf das nächste zeichen zeigt. das kostet natürlich speicherplatz. andererseits würde jedesmal ein array zu deklarieren, dass ca 50000 indizes hat auch beträchtlich ins gewicht fallen. zu der geschwindigkeit bzw. ausführungszeit kann ich leider nichts sagen, da ich nicht weiss ob der zugriff auf ein array, angefangen von 0 bis n (chronologische abarbeitung der zeichen) oder ob sich das durchhangeln durch eine verkettete liste als schneller erweist. aber ich glaube von den verketteten liste lass ich erstmal ab. wenn ich mir dass so hochrechne, also nur den platzverbrauch der pointer pro zeichen, dann würde ich bei sagen wir mal 1000 zeichen ungefähr auf 4000byte kommen. hwierig, aber das ist bestimmt nicht effektiv. String einlesen c online. und wenn ich einen ganzen aufsatz mit ca 100000 zeichen einlesen will (denn sowas in der art hab ich vor), dann ergäbe sich ein speicherverbrauch von ~ 400000byte. das ist eindeutig zuviel.