crash del programma con i puntatori cercando di fare strcpy-like
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.
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.