Grösse von char* dynamisch anpassen
-
Hallo zusammen. Folgendes Problem
Ich allokiere mittelschar* ret=(char*)malloc(sizeof(char)*10000);
Speicher für ein char*. Ich würde aber lieber die Größe zur laufzeit ensprechend den Anforderungen anpassen. Ich hatte eigentlich gedacht das strcat diese Funktion erfüllen könnte da ret immer den Anforderungen entsprechend vergrößert wird. Leider bekomme ich dennoch einen Fehler.
Gruß Jetyt
-
blablub schrieb:
Hallo zusammen. Folgendes Problem
Ich allokiere mittelschar* ret=(char*)malloc(sizeof(char)*10000);
...
Ich würde aber lieber die Größe zur laufzeit ensprechend den Anforderungen anpassen.ret = (char*) realloc (ret, sizeof (char) * neue_groesse);
Moritz
-
Casten ist unnötig und sizeof(char) ist immer 1, also auch unnötig.
-
audacia schrieb:
ret = (char*) realloc (ret, sizeof (char) * neue_groesse);
Nene. Falls realloc fehlschlägt, so bleibt der übergebene Zeiger weiterhin gültig, darum ist es eine schlechte Idee, den gleich zu überschreiben.
-- sizeof(char) ist übrigens immer eins und der Cast darf auch entfallen.
-
Daniel E. schrieb:
Nene. Falls realloc fehlschlägt, so bleibt der übergebene Zeiger weiterhin gültig, darum ist es eine schlechte Idee, den gleich zu überschreiben.
Wenn aber nicht mehr genug Speicher angefordert werden kann, ist sowieso alles zu spät
Daniel E. schrieb:
-- sizeof(char) ist übrigens immer eins und der Cast darf auch entfallen.
Sorry, bin noch verwöhnt von std::vector
und mit den C-Konventionen nicht ganz sicher. (ich glaube, in C++ braucht man hier einen Cast, oder?)
Moritz
-
audacia schrieb:
Daniel E. schrieb:
Nene. Falls realloc fehlschlägt, so bleibt der übergebene Zeiger weiterhin gültig, darum ist es eine schlechte Idee, den gleich zu überschreiben.
Wenn aber nicht mehr genug Speicher angefordert werden kann, ist sowieso alles zu spät
Es ist nie zu spät, das Programm sauber zu beenden und auch den ganzen reservierten Speicher wieder mit free() freizugeben!
Wenn realloc() fehlschlägt, also nicht mehr genügend Speicher zur Verfügung steht, dann heißt das noch lange nicht, dass der vorher reservierte Speicher schon freigegeben ist.(ich glaube, in C++ braucht man hier einen Cast, oder?)
Richtig, ein C++-Compiler bringt einen Fehler, wenn nicht gecastet wird.
-
Wenn dir die Handhabung von strings schwer fehlt, dann kannst du dir das hier anschauen oder benutzen http://pcpool.mathematik.uni-freiburg.de/~pabloy/projects/sstrings/ Ich hab bereits viele Tests gemacht und bisher keine Fehler festgestellt. In kurzer Zeit werde ich ein neues Release machen, mit 10 neuen Funktionen, aber das kann noch ein bisschen dauern, da das Semester heute angefangen hat und keine Zeit für die online Doukemtation hatte.
Du kannst anschauen, wie ich dort realloc/malloc benutzt hab.
-
Mal zu der cast-Problematik. Gehört es nicht zum guten Ton zu casten? So von wegen Lesbarkeit (für andere) usw.
-
Maffe001 schrieb:
Mal zu der cast-Problematik. Gehört es nicht zum guten Ton zu casten? So von wegen Lesbarkeit (für andere) usw.
casten gehört dort, wo es 1. Sinn macht 2. wo es notwenig ist. Ein void* ist in C nicht notwenig zu casten, deshalb tut man es auch nicht. Ein C Programmier weiß es und versteht es auch.