Programa de travamento com ponteiros tentando fazer strcpy
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 .
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.