Pergunta

Este é o meu segundo problema hoje, os ponteiros estão me dando pesadelos. Estou tentando fazer um programa que faça a mesma coisa que a função strcpy () faz .. Depois de tentar ... trava e tenho 100% de certeza de que esse é um problema de indicadores no meu código. Eu acho que porque existe algum tipo de ponteiro não relógico (*copiado) .. mas eu atribuí nulo para ele ... então alguém pode me dizer para que serve a atribuição nula? Porque acho que entendi mal seu uso. E diga -me, por favor, quais correções podem ser feitas no programa para executar 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);

}

Desde já, obrigado .

Foi útil?

Solução

Bem, você mycpy está quase certo (embora você possa ter usado suportes em vez de aritmética, ou seja, a[i] ao invés de *(a+1)). Para imprimir a corda copiada corretamente, o último personagem deve ser zero, mas o último é não copiado por sua função. Então deve ser como

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    
}

Além disso, a variável

char *copied = 0 ;

Não aponta para a memória válida, então você está lendo a posição de memória 0, o que é ilegal. Você pode definir a variável como matriz

char copied[20];

Outras dicas

Você deve alocar alguma memória para o resultado da operação de cópia.

No seu caso copied não foi inicializado, então você está tentando escrever para um ponteiro nulo. O seguinte alocará memória suficiente para você copiar original em copied

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

Você tem ponteiros, mas eles não estão apontando para nenhuma memória. Você precisa alocar alguma memória para que isso funcione.

char *original;

Isso é apenas um ponteiro para alguma memória do tipo char. Você não pode definir isso como "Este é um texto" porque é apenas um ponteiro. Não tem espaço para armazenar "Este é um texto".

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

vai funcionar, ou

char *original;
char * copied;

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

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

Ambos os métodos pegam 15 bytes para você armazenar seu texto. O primeiro exemplo usa 15 bytes da pilha. O segundo exemplo usa 15 bytes da pilha.

Fixo:

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

Nesta linha:

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

é a desreferência de b+i Isso causa o erro. Você está desreferenciando 0 (NULL), que é o erro do ponteiro número 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top