2010-02-12 4 views
1

Ceci est mon deuxième problème aujourd'hui, les pointeurs me donnent des cauchemars. J'essaie de faire un programme qui fait la même chose que la fonction strcpy() faire .. Une fois que je l'ai essayé ... il plante et je suis sûr à 100% que c'est un problème de pointeurs dans mon code. Je pense qu'il y a une sorte de pointeur non numérisé (* copié) ..Mais j'ai assigné NULL à celui-ci ... donc quelqu'un peut-il me dire à quoi correspond exactement l'affectation de Null? parce que je pense que je me méprends sur son utilisation. et dites-moi s'il vous plaît quelles corrections peuvent être apportées au programme pour fonctionner normalement.Crash de programme avec des pointeurs essayant de faire des strcpy-like

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

Répondre

4

Eh bien, votre mycpy est presque droite (bien que vous auriez pu les supports utilisés à la place de l'arithmétique, à savoir a[i] au lieu de *(a+1)). Afin d'imprimer la chaîne copiée correctement, le dernier caractère doit être zéro, 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  
} 

De plus 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]; 
1

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

char *original; 

Ceci est juste un pointeur vers une mémoire de type char. Vous ne pouvez pas définir cela sur "ceci est un texte" parce que c'est juste un pointeur. Il n'a pas d'espace pour stocker "ceci 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 utilise 15 octets du tas.

3

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

Dans votre cas, copied n'a pas été initialisé, vous essayez donc d'écrire sur 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]; 
+0

veulent probablement strlen (d'origine) + 1, et rafael veut probablement copier la terminaison \ 0 ainsi. – ChrisInEdmonton

+0

@ChrisInEdmonton, merci, se précipitait et ne prêtait pas attention .... – Glen

0

Dans cette ligne:

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

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

1

fixe:

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