Adressübergabe bei char
-
Servus zusammen!
Angeregt durch einen aktuellen Thread in diesem Forum habe ich eben (versucht) mir eine eigene Sortierfunktion zu schreiben.Hier der Code.
#include <iostream> using namespace std; void swap(char *arg1, char *arg2) { char *temp = new char[strlen(arg1) + 1]; temp = arg1; arg1 = arg2; arg2 = temp; delete[] temp; temp = NULL; } int sortWords(char *arr[], const int size) { for(int i = 0; i < size; ++i) { for(int j = i; j < size; ++j) { if(arr[i][0] > arr[j][0]) { swap(arr[i], arr[j]); } else if(arr[i][0] == arr[j][0]) { for(unsigned int k = 1; k < strlen(arr[i]) && k < strlen(arr[j]); ++k) { if(arr[i][k] > arr[j][k]) swap(arr[i], arr[j]); else if(arr[i][i] == arr[j][k]) continue; else break; } } } } return 0; }
Nun meine Frage. Die Adressen werden doch an die Funktion swap() übergeben und dort getauscht. (Das habe ich nachgeprueft
).
Aber wieso sind die Werte (der getauschten Adressen) nach der Funktion swap() wieder "unvertauscht"?? Ich dachte wenn man einer Funktion die Adresse eines Wertes uebergebt, und die Werte dann anhand der Adresse tauscht, bleibt der Tausch auch nach dem verlassen der Tauschfunktion erhalten.Naja, wäre schön, wenn ihr mir helfen könntet.
Caipi
-
Die Argumente (arg1 und arg2) der Funktion Swap sind nur Kopieen der Adressen der Char-Strings. Am Anfang der Funktion zeigt arg1 auf den String1, arg2 auf den String2.
Jetzt vertuascht du nur die Pointer, und nicht das, auf was sie zeigen. Am Ende von Swap ist also arg1 ein Pointer auf den String2 und arg2 ein Pointer auf den String1. Bytes, die zu dem String gehören hast Du gar nicht angefasst...
LG, J.
P.S.
Ich sehe gerade noch ein ganz anderes Problem. Du reservierst Speicherplatz für deinen Temporär String (den Du gar nicht nutzt) und überschreibst den Pointer temp mit der Adresse von arg1. Dadurch verlierst Du die Adresse des gerade reservierten Speicherplatzes, und dieser Speicher wird nie wieder frei gegeben (wenn Dein Hauptspeicher voll ist musst Du Dir einen neuen Computer kaufen) Schlimmer noch. Beim delete[] temp zeigt temp auf den Speicherplatz des String1, also gibts Du diesen frei (der dadurch bei einem nachfolgenden new also überschrieben werden kann).
Mein Rat, benutzt STL-Strings, oder andere String-Klassen, das macht einiges Einfacher
LG, J.
-
void swap(char *arg1, char *arg2) { char *temp = new char[strlen(arg1) + 1]; temp = arg1; arg1 = arg2; arg2 = temp; delete[] temp; temp = NULL; }
das ist denkbar schlecht.
1. die korrekte version:void swap(char*& arg1, char*& arg2) { char *temp temp = arg1; arg1 = arg2; arg2 = temp; }
2. die arbeitssparende version mit beispiel
#include <algorithm> #include <iostream> //in der main char* a=new char[100]; char* b=new char[100]; std::cin>>a; std::cin>>b; std::swap(a,b); std::cout<<a<<b;
3. und hier die einfache version mit beispiel
#include <algorithm> #include <iostream> #include <string> //in der main std::string a; std::string b; std::cin>>a; std::cin>>b; std::swap(a,b); std::cout<<a<<b;
-
Danke euch beiden.
@JoeX
Wenn ich das richtig verstanden habe, heißt das, dass ich wenn ich einen char-Zeiger habe und ihm direkt eine Adresse zuweise, vorher keinen Speicher reservieren muss?@otze
heißt z.B. char*& arg1: Adresse von Argument 1?Caipi
-
char*& arg1
arg1 ist referenz auf pointer auf char
K.
-
Danke euch allen!
Caipi