elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Concatenar cadenas con memoria dinámica en lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Concatenar cadenas con memoria dinámica en lenguaje C.  (Leído 4,592 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Concatenar cadenas con memoria dinámica en lenguaje C.
« en: 19 Junio 2016, 14:33 pm »

Hola, gente.
Les quito un poco de tiempo porque si bien estoy leyendo que es lo que causa el doble free no logro solucionarlo por mí mismo y si lo lograra me quedarían dudas en la función concatenar, les digo esto porque si bien logre que no me diera error en la compilación lo hice a fuerza de prueba/error/solución pero no teniendo claro que es lo que estaba haciendo. -
Las cosas que no me quedan claras:

1): Porque debo hacer que la función se declare como un puntero a función.
2): Porque el error del doble free.
3): Como se hace para poner un espacio entre las dos frases (por programación, claro).-
  
Código
  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. #define MAX 51
  6.  
  7. void ingreso( char origUno[], char origDos[] );
  8. void limpiarBuffer( char cadena[] );
  9. char *concatenar( char *origUno, char *origDos );
  10.  
  11. int main( void ){
  12. char origUno[MAX] = "", origDos[MAX] = "", *ptrConc = NULL;
  13.  
  14. ingreso( origUno, origDos );
  15. ptrConc = concatenar( origUno, origDos );
  16.  
  17. printf("\n %s", ptrConc);
  18.  
  19. free(ptrConc);
  20.  
  21. return 0;
  22. }
  23.  
  24. void ingreso( char origUno[], char origDos[] ){
  25.  
  26. printf( "\n Ingrese una frase(maximo %d caracteres)............:", MAX-1 );
  27. fgets(origUno, MAX, stdin);
  28. limpiarBuffer( origUno );
  29.  
  30. printf( "\n Ingrese frase a concatenar (maximo %d caracteres)..:", MAX-1 );
  31. fgets(origDos, MAX, stdin);
  32. limpiarBuffer( origDos );
  33. }
  34.  
  35. void limpiarBuffer( char cadena[] ){
  36. char *p = NULL;
  37. size_t ch;
  38.  
  39. if((p=strchr(cadena, '\n'))){
  40. *p='\0';
  41. }
  42. else{
  43. while((ch = getchar()) !='\n' && ch!=EOF);
  44. }
  45. }
  46.  
  47. char *concatenar( char *origUno, char *origDos ){
  48. size_t totCarac = strlen( origUno ) + strlen( origDos ) + 1;
  49. char *arr = ( char* )malloc( totCarac * sizeof(char) );
  50. arr = strcat( origUno, origDos );
  51.  
  52. return arr;
  53. }
  54.  

Saludos y desde ya muchas gracias. -


« Última modificación: 20 Junio 2016, 16:16 pm por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Doble free.
« Respuesta #1 en: 19 Junio 2016, 15:41 pm »


1): Porque debo hacer que la función se declare como un puntero a función.


Es el tipo de dato que devuelve la funcion, no es que sea un puntero a funcion, es una funcion que devuelve un tipo de  dato
;
Código
  1. char* funcion();

No veo ningun doble free en tu codigo. Lo que veo es que estas tratando de liberar una sección de memoria no liberable. Esto es que solo puedes liberar memoria reservada por malloc, calloc y realloc pero tu apuntador posteiormente apunta a origUno por el strcat que haces incorrectamente.

Segun:

Código
  1. char *arr = ( char* )malloc( totCarac * sizeof(char) );

Reservas memoria el buffer completo pero despues reasignas el valor de arr a la direccio  de origUno.

Código
  1. arr = strcat( origUno, origDos );

que seria la direccion de origUno...

Necesitas primero realizar un strncpy de origUno a arr y luego realizar la concatenacion.

Sobre el espacio tendrias que hacer:

Código
  1. strcpy(arr,origUno);
  2. strcat( arr, " ");
  3. strcat( arr, origDos );


Nota que uso strcpy y no strncpy ya que como capturaste correctamente origUno y reservastes memoria suficiente para arr no hay riesgo de bufferoverflow. En cualquier otro caso usaria strncpy...

Saludos


« Última modificación: 19 Junio 2016, 15:55 pm por AlbertoBSD » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Doble free.
« Respuesta #2 en: 19 Junio 2016, 19:11 pm »

Hola, Alberto. -
Muchas gracias amigo funciona a la perfección, pero igual me queda una duda y es que al tener un espacio creado con:
Código
  1. strcat( arr, " ");
¿no debería reservar un espacio más?  
Código
  1. size_t totCarac = strlen( origUno ) + strlen( origDos ) + 1;
Un abrazo.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Doble free.
« Respuesta #3 en: 19 Junio 2016, 19:22 pm »

Así es se me paso comentar eso.

Debería de ser +2 en lugar de +1.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Concatenar cadenas
Programación C/C++
caronte80 4 4,527 Último mensaje 31 Agosto 2012, 23:38 pm
por avesudra
Problema leyendo cadenas con memoria dinamica [solucionado]
Programación C/C++
dato000 9 7,212 Último mensaje 24 Enero 2014, 18:37 pm
por dato000
arreglo de cadenas con memoria dinamica
Programación C/C++
wolftdark 2 2,276 Último mensaje 7 Julio 2015, 03:30 am
por wolftdark
Arreglo con memoria dinámica en lenguaje C. « 1 2 »
Programación C/C++
NOB2014 14 5,303 Último mensaje 26 Mayo 2016, 03:11 am
por NOB2014
Arreglo de cadenas con memoria dinámica (realloc) lenguaje C.
Programación C/C++
NOB2014 9 7,336 Último mensaje 4 Octubre 2016, 17:42 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines