Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: onlinne en 6 Noviembre 2016, 22:33 pm



Título: Ayuda, que esta mal ?
Publicado por: onlinne en 6 Noviembre 2016, 22:33 pm
Tengo esta funcion:
#include <stdio.h>
#include <conio.h>

char *copiar(char * cad)
{
   char cad2[20];
   int i=0;
   while((cad!='\0') || (cad[i+1]!='\0'))
   {
      cad2== cad;
      i++;
   }return cad2;
}
int main()
{
   char cad[20];
   scanf("%s",&cad);
   printf("%s",copiar(cad));
   getch();
}

lo que hace es copiar los caracteres de un vector a otro. pero cuando la pongo a ejecutar me da unos caracteres muy extraños, y ayer , que fue la ultima vez que funciono, cuando ponia dos palabras ejemplo: Hola como estas. solo me mostraba el hola, no el resto


Título: Re: Ayuda, que esta mal ?
Publicado por: MAFUS en 6 Noviembre 2016, 22:57 pm
Tienes mal 2 cosas.
Código:
scanf("%s",&cad);
Una variable tipo cadena no debe pasarle su dirección con & a scanf.
Debería ser así:
Código:
scanf("%s", cad);

Por otra parte estás devolviendo, en la función copiar, un array local. Éste se destruye al salir de la función. Deberías usar malloc sobre un puntero y devolverlo; esto es memoria del montón y permanece entre llamadas, a diferencia de la pila.


Título: Re: Ayuda, que esta mal ?
Publicado por: onlinne en 6 Noviembre 2016, 23:02 pm
no entiendo :

Por otra parte estás devolviendo, en la función copiar, un array local. Éste se destruye al salir de la función. Deberías usar malloc sobre un puntero y devolverlo; esto es memoria del montón y permanece entre llamadas, a diferencia de la pila.
podrias explicarlo porfavor


Título: Re: Ayuda, que esta mal ?
Publicado por: MAFUS en 6 Noviembre 2016, 23:29 pm
Tiene que ver con la memoria de la pila (stack) y el montón (heap).
Cuando entras en una función C adquiere espacio en la pila para las variables y los arrays. Cuándo se sale de la función toda esta memoria desaparece.
Por otra parte la memoria del montón es más permanente, por el hecho de que la controlas tú. Adquieres memoria con una de las funciones de la familia malloc. Si creas un array en el montón, éste no depende de la función por eso aunque salgas de ella lo que hay en memoria permanece. Si devuelves de la función el puntero que apunta a esa zona de memoria, en tu main recibirás dicha dirección y podrás trabajar con ella.

Te recomiendo que busques sobre memoria stack y heap. Te aclarará muchas dudas.