Programmabsturz mit Zeigern versuchen zu machen strcpy-like
Frage
Dies ist mein zweites Problem ist heute, Zeiger geben mir Albträume. Ich versuche, ein Programm zu machen, die das gleiche tun, dass strcpy () Funktion tun .. Wenn ich versuche, it..it abstürzt und ich bin 100% sicher, dass in meinem Code ein Zeiger Problem ist. Ich denke, weil es irgendeine Art eines unintiallized Zeiger (* kopiert) ..Aber i NULL zugewiesen habe ... so kann jemand mir sagen, was ist Null Zuordnung ist genau für? weil ich denke, falsch verstehen ich seine Verwendung. und sagen Sie mir bitte, was Korrekturen an dem Programm vorgenommen werden normal ausgeführt.
#include <iostream>
using namespace std;
void mycpy(char *b , char *a);
int main()
{
char *original = "this is a text" ;
char *copied = 0 ;
mycpy(copied , original);
for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;
return 0;
}
void mycpy(char *b , char *a){
for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
}
Vielen Dank im Voraus.
Lösung
Nun, das ist Ihre mycpy
fast richtig (obwohl Sie gebrauchte Klammern haben könnten anstelle der Arithmetik, das heißt a[i]
statt *(a+1)
). Um richtig die kopierte Zeichenfolge zu drucken, muss das letzte Zeichen Null sein, aber der letzte ist nicht durch Ihre Funktion kopiert. So sollte es eher wie sein
void mycpy(char *b , char *a)
{
int i;
for(i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
*(b+i) = 0; // or "\0", doesn't matter
}
Darüber hinaus wird die Variable
char *copied = 0 ;
verweist nicht auf gültige Speicher, so dass Sie das Lesen von Speicherposition 0, was illegal ist. Sie könnten die Variable als Array definieren
char copied[20];
Andere Tipps
Sie haben einige Speicher für das Ergebnis des Kopiervorgangs zuzuweisen.
In Ihrem Fall copied
wurde nicht initialisiert, so dass Sie zu schreiben, um einen Null-Zeiger versuchen. Im Folgenden wird genug Speicher reservieren für Sie original
in copied
kopieren
char* copied = new char[strlen(original)+1];
Sie haben Zeiger, aber sie weisen nicht auf einen Speicher. Sie müssen einige Speicher für diese Arbeit zuzuweisen.
char *original;
Das ist nur ein Zeiger auf einen Speicher, der vom Typ char ist. Sie können nicht festgelegt, dass auf „dies ein Text ist“, weil es nur ein Zeiger ist. Es hat keinen Platz zum Speichern von „Dies ist ein Text“.
char original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";
funktionieren wird, oder
char *original;
char * copied;
original = malloc( 15 );
copied = malloc( 15 );
mycpy( original, "this is a text" );
mycpy( copied, original );
Beide Methoden greifen 15 Bytes für Sie Ihren Text zu speichern. Das erste Beispiel wird mit 15 Byte aus dem Stapel. Das zweite Beispiel verwendet 15 Bytes aus dem Heap.
Fixed:
#include <iostream>
using namespace std;
void mycpy(char *b , char *a);
int main()
{
char *original = "this is a text" ;
char copied[30]; // you need to actualy allocate space
// (this is on stack, you could use new as well, for heap allocation)
mycpy(copied , original);
for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;
return 0;
}
void mycpy(char *b , char *a){
int i =0;
while (*(a+i)) {
*(b+i) = *(a+i);
++i;
}
*(b+i) = '\0'; // null termination
}
In dieser Zeile:
for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
es ist die Dereferenzierung von b+i
, die den Fehler verursacht. Du dereferencing 0
(NULL), die die Nummer 1 Zeigerfehler ist.