string kopieren --> access violation
-
Hi Leute,
ab und an mal führt dieser Code hier zu einer Access Violation.
// einen string kopieren char * copystring(char *pDest, const char *toCopy, int length) { for(int x = 0; x < length; x++) { pDest[x] = toCopy[x]; } return pDest; }
Ich könnt mir vorstellen, dass der über ein Array drüber schreibt.
Aber sicher bin ich mir nicht, ob's daran liegt.Weiss jemand von euch, warum er dabei abstürzen könnte?
Und wie könnt ich den Code umbauen, damit er absturzsicher ist?strcpy() oder strncpy() bringt mir nix.
Denn der Code soll folgendes machen können:Beispiel:
char test[20]; char * hallo = "dies ist ein test"; copystring(test, &hallo[3], 7);
-
Hallo,
wahrscheinlich ist, dass pDest zu klein ist, um alle Daten von toCopy
aufzunehmen.Und warum solltest du strncpy etc. nicht nutzen koennen? Angenommen du machst
aus deiner Funktion folgende:char * copystring(char *pDest, const char *toCopy, int length) { return strncpy(pDest,toCopy,length); }
dann funktioniert
char test[20]; char * hallo = "dies ist ein test"; copystring(test,&hallo[3],7);
auch. Denn toCopy zeigt jetzt auf das vierte Element und ab diesem werden
die naechsten 7 Zeichen nach test kopiert.mfg
v R
-
Was stoert dich an strncpy?
Abstuerzen kann copystring sehr leicht: wenn pDest weniger Speicher hat, als gebraucht wird.
Abfangen kannst du das in copystring nicht.Deshalb verwendet man gerne string Klassen (zB std::string)
Da macht man dann ein praktisches
string s; char* hallo=" hallo"; s.assign(hallo+1, hallo+strlen(hallo));
-
strings enden in C++ immer mit einem 0-Byte '\0'.
alle string-funktionen müssen dieses 0-Byte an einen String anhängen.
Der String "Hallo" verbraucht somit 6 Bytes.Der Zeiger pDest muss mit new oder malloc initialisiert worden sein, damit
du ihn verwenden kannst.pDest = new char[6]; copystring(pDest, "dlfiasjdfiajewoiwejroiwejro", 5); copystring(pDest, "dlfiasjdfiajewoiwejroiwejro", 6); //fehler, auch wenns funktioniert .... delete []pDest; // einen string kopieren char * copystring(char *pDest, const char *toCopy, int length) { if(!pDest) { printf("Nullpointer exception!\n"); abort(); } for(int i = 0; i < length; i++) { pDest[i] = toCopy[i]; } pDest[i] = 0; return pDest; }
mfg
Michael
-
CPPhacker schrieb:
Der Zeiger pDest muss mit new oder malloc initialisiert worden sein, damit du ihn verwenden kannst.
oder auf ein Array zeigen (so wie in implementors Beispiel)