Pregunta

Este es mi segundo problema hoy en día, los punteros me están dando pesadillas. Estoy tratando de hacer un programa que haga lo mismo que la función strcpy () hacer .. Una vez que intento it..it se estrella y estoy 100% seguro de que es un problema de punteros en mi código. Creo que es porque hay algún tipo de un puntero unintiallized (* copiados) ..Pero he asignado a NULL ... así que alguien me puede decir lo que es la asignación nula es exactamente para? Porque creo que malinterprete su uso. y dime por favor, lo que se pueden realizar correcciones al programa para funcionar 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);

}

Gracias de antemano.

¿Fue útil?

Solución

Bueno, tu mycpy es casi justo (aunque se podría haber soportes utiliza en lugar de la aritmética, es decir, en lugar de a[i] *(a+1)). Con el fin de imprimir la cadena copiado correctamente, el último carácter debe ser cero, pero el último es no copiada por su función. Por lo tanto, debería ser más bien 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    
}

Además la variable

char *copied = 0 ;

no apunta a una memoria válida, por lo que está leyendo desde la posición de memoria 0, lo que es ilegal. Se podría definir la variable como array

char copied[20];

Otros consejos

Hay que destinar parte de la memoria para el resultado de la operación de copia.

En su caso copied no se ha inicializado, por lo que está tratando de escribir a un puntero nulo. El siguiente será asignar memoria suficiente para copiar original en copied

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

Usted tiene punteros, pero no está apuntando a cualquier memoria. Es necesario asignar parte de la memoria para que esto funcione.

char *original;

Esto es sólo un indicador a una memoria que es de tipo char. No se puede establecer que a "este es un texto", ya que es sólo un puntero. No tiene ningún espacio para almacenar "se trata de un texto".

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

va a funcionar, o

char *original;
char * copied;

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

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

Ambos métodos agarrar 15 bytes para almacenar el texto. El primer ejemplo utiliza 15 bytes de la pila. El segundo ejemplo se utiliza 15 bytes de la pila.

Fijo:

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

En esta línea:

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

es desreferenciar b+i que causa el error. Estás dereferencing 0 (NULL), que es el error número 1 puntero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top