Domanda

Questo è il mio secondo problema di oggi, i puntatori mi stanno dando incubi. Sto cercando di fare un programma che fanno la stessa cosa che la funzione strcpy () fare .. Una volta che provo it..it crash e sono sicuro al 100% che è un problema puntatori nel mio codice. Credo perché ci sia una sorta di un puntatore unintiallized (* copiato) ..Ma ho assegnato NULL ad esso ... così qualcuno mi può dire cosa c'è assegnazione Null è proprio per? perché credo di fraintendere il suo utilizzo. e mi dica per favore quali correzioni può essere fatto per il programma da eseguire normalmente.

 #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);

}

Grazie in anticipo.

È stato utile?

Soluzione

Bene, il vostro mycpy è quasi a destra (anche se avresti potuto parentesi usato al posto di aritmetica, vale a dire a[i] invece di *(a+1)). Per stampare correttamente la stringa copiata, l'ultimo carattere deve essere pari a zero, ma l'ultima è non copiati dalla funzione. Così dovrebbe piuttosto essere come

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    
}

Inoltre la variabile

char *copied = 0 ;

non puntare a memoria valida, in modo che stai leggendo dalla posizione di memoria 0 che è illegale. Si potrebbe definire la variabile come array

char copied[20];

Altri suggerimenti

È necessario allocare una certa memoria per il risultato della operazione di copia.

Nel tuo caso copied non è stata inizializzata, quindi si sta cercando di scrivere in un puntatore nullo. Di seguito vi allocare memoria sufficiente per copiare original in copied

char* copied = new char[strlen(original)+1];

Hai puntatori, ma non si punta a qualsiasi memoria. È necessario allocare una certa memoria per questo al lavoro.

char *original;

Questa è solo un puntatore a qualche memoria che è di tipo char. Non è possibile impostare che a "questo è un testo" perché è solo un puntatore. Non ha alcun spazio per immagazzinare "questo è un testo".

char original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";

funzionerà, o

char *original;
char * copied;

original = malloc( 15 );
copied = malloc( 15 );

mycpy( original, "this is a text" );
mycpy( copied, original );

Entrambi questi metodi afferrare 15 byte per archiviare il testo. Il primo esempio utilizza 15 byte dallo stack. Il secondo esempio utilizza 15 byte dal mucchio.

fissi:

 #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 questa riga:

for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

è il dereferenziazione di b+i che causa l'errore. Stai dereferencing 0 (NULL), che è l'errore numero 1 puntatore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top