char-Array innerhalb von Funktion dynamisch anpassen
-
Hallo Leute,
ich hab hier gerade ein kleines Problemchen: Ich brauche eine Funktion, die ein char-Array manipuliert und dessen Größe dynamisch anpasst. Dazu hab ich momentan nur folgende Lösung: Ich gebe die Addresse eines im Heap befindlichen Speicherbereichs zurück, der ja auch nach beendigung der Funktion erhalten bleibt. Nur leider lässt sich damit nicht so schön auswerten, ob die Funktion fehlgeschlagen ist, ich würde stattdessen lieber einen int-Wert zurückgeben. Also habe ich probiert, der Funktion eine Start-Addresse eines bestehenden char-Arrays zu übergeben, das funktioniert aber natürlich auch nicht, da es ja sein kann, dass realloc() das Array an eine andere Stelle kopieren muss, und dann das Array in der aufrufenden Funktion auf irgendwas zeigt.
Gibt es vielleicht sonst noch irgendeine Möglichkeit mein Problem zu lösen oder lässt sich das in ANSI-C nicht machen?
Ich meine, die ganzen Standard-C Funktionen die char-Arrays verändern, benötigen ja auch immer noch die Array-Größe als zweiten Parameter oder überschreiben nicht reservierte Speicherbereiche (scanf) oder? Von daher glaub ich nicht wirklich, dass das geht, aber vielleicht gehts ja doch, also, falls jemand was weiß, bitte meldenVielen Dank im vorraus
David.
-
2 Moeglichkeiten:
char* function(char* p) { //mach was if(fehlgeschlagen) return 0; //... return p; }
oder
int function(char** p) { //mach was -> *p entspricht p im oberen Beispiel }
Ich finde die Variante 1 schoener.
-
danke, shadeofmine,
werd das gleich mal testen. Aber kannst du mir sagen, warum ich auch einen integer-wert in Variante 1 zurückgeben kann? Und wie kann ich dann in der aufrufenden Funktion am besten testen, ob ein int oder ein char-Array zurückgegeben wurde?thx
david.
-
statt 0 kannst du dir dort auch NULL denken, wenn es dann klarer ist.
Ein Zeiger zeigt auf eine Speicheradresse - soweit ist es ja klar.
Wenn wir nun 0 zurueckgeben, dann zeigt der Zeiger auf die Adresse 0. Diese ist immer eine ungueltige Adresse.Du kannst somit sicher sein, wenn function() 0 returned, dass es einen Fehler gab.
Dies funktioniert nur mit 0 - denn jede andere Zahl kann theoretisch auch eine richtige Adresse sein.
Diese NULL-Zeiger koennten dir von fopen(), malloc(), ... bekannt vorkommen.
-
jetzt is klar...dachte, ich könnte da jeden beliebigen int zurückgeben...
also im Hauptprogramm dann mitif(str==NULL)
vermute ich...
danke nochmal
david.
-
exakt!
Ich bin nur so in C++ drinnen, deshalb habe ich 0 statt NULL geschrieben - sorry
-
Schreibt man in C++ denn '0' statt 'NULL'? Find letzteres nämlich recht praktisch, da man so ja leicht einen Pointer erkennen kann...
-
Stroustrup, 4.Auflage schrieb:
(...)In C war es populär, ein Makro NULL zu definieren, um den Nullzeiger zu repräsentieren. Durch die engere Typprüfung con C++ führt die Benutzung der einfachen 0 anstelle des NULL-Makros zu weniger Problemen. Wenn sie meinen, NULL definieren zu müssen, dann benutzen sie:
const int NULL = 0;
(...)Seite 96, Kapitel 5.1.1.
Gruß
E-the-Real
-
Danke.