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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top