Question

Ceci est mon deuxième problème aujourd'hui, les pointeurs me donnent des cauchemars. Je suis en train de faire un programme qui font la même chose que la fonction strcpy () j .. Une fois que j'essaie it..it se bloque et je suis 100% sûr que ce un problème de pointeurs dans mon code. Je pense parce qu'il ya une sorte d'un pointeur unintiallized (* Copié) ..Mais j'ai assigné NULL à ... donc quelqu'un peut me dire ce qui est exactement l'affectation Null pour? parce que je pense que je comprends mal son utilisation. et dites-moi s'il vous plaît ce que les corrections peuvent être apportées au programme de fonctionner normalement.

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

}

Merci d'avance.

Était-ce utile?

La solution

Eh bien, votre mycpy est presque droite (bien que vous auriez pu les supports utilisés au lieu de l'arithmétique, à savoir a[i] au lieu de *(a+1)). Pour imprimer correctement la chaîne copiée, le dernier caractère doit être nul, mais le dernier est pas copié par votre fonction. Donc, il devrait plutôt être comme

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    
}

En outre, la variable

char *copied = 0 ;

ne pointe pas à la mémoire valide, de sorte que vous lisez de la position de mémoire 0 qui est illégal. Vous pouvez définir la variable sous forme de tableau

char copied[20];

Autres conseils

Vous devez allouer de la mémoire pour le résultat de l'opération de copie.

Dans votre copied cas n'a pas été initialisées, de sorte que vous essayez d'écrire à un pointeur NULL. Ce qui suit allouer suffisamment de mémoire pour vous de copier original dans copied

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

Vous avez des pointeurs, mais ils ne pointent pas vers une mémoire. Vous devez allouer de la mémoire pour que cela fonctionne.

char *original;

C'est juste un pointeur vers une mémoire qui est de type char. Vous ne pouvez pas définir cela à «c'est un texte » parce qu'il est juste un pointeur. Il n'a pas d'espace pour stocker «c'est un texte ».

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

fonctionnera ou

char *original;
char * copied;

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

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

Ces deux méthodes attraper 15 octets pour stocker votre texte. Le premier exemple utilise 15 octets de la pile. Le deuxième exemple, on utilise 15 octets à partir du tas.

Correction:

 #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
}

Dans cette ligne:

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

il est le déréférencement de b+i qui provoque l'erreur. Vous déréférencement 0 (NULL), qui est le numéro 1 erreur de pointeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top