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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Leer un string con memoria dinámica ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Leer un string con memoria dinámica ?  (Leído 6,543 veces)
Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Leer un string con memoria dinámica ?
« en: 17 Julio 2021, 20:16 pm »

Buenas genios, me surgió la siguiente duda, tal vez alguien que la tenga más clara puede ayudarme.

Es válida esta forma de asignar un string de manera dinámica ? Si o si necesito utilizar un arreglo estático auxiliar ?

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. int main()
  7. {
  8.    char cadena_aux[100] = { 0 };
  9.    char *cadena = NULL;
  10.    int tam_cadena = 0;
  11.  
  12.    puts("Introducir una linea de texto.");
  13.    fgets(cadena_aux,100,stdin);
  14.  
  15.    tam_cadena = strlen(cadena_aux);
  16.  
  17.    cadena = (char * ) malloc ( ( tam_cadena + 1 ) * sizeof(char) );
  18.  
  19.    if(cadena == NULL)
  20.    {
  21.        printf("Error en asignacion de memoria.\n");
  22.        exit(EXIT_FAILURE);
  23.    }
  24.  
  25.    strcpy(cadena,cadena_aux);
  26.  
  27.    printf("cadena = %s\n",cadena);
  28.  
  29.    free(cadena);
  30.  
  31.    return 0;
  32. }
  33.  
  34.  
  35.  

Luego, tras hacer la copia del estatico al dinámico, al intentar liberar la memoria utilizada en el arreglo estático me tira error...


« Última modificación: 17 Julio 2021, 20:19 pm por Locura_23 » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.605


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Leer un string con memoria dinámica ?
« Respuesta #1 en: 17 Julio 2021, 22:12 pm »

Hola,

Citar
cadena = (char * ) malloc ( ( tam_cadena + 1 ) * sizeof(char) );

Te recomendaría reemplazar malloc por calloc para rellenar el espacio asignado con ceros ya que por defecto malloc asigna espacio pero no limpia, este espacio asignado puede contener partes de la memoria sin usar. Recuerda que strcpy realiza una copia byte por byte pero cadena es un stream no un array de datos, en ese caso deberías llamar a una función de copiado de memoria y no de caracteres, pero tu auxiliar no es un stream sino un array.

Si usas c++ en ves de c puro, podrías considerar utilizar std::string y std::getline para la obtención y procesamiento de datos en ves de tener que utilizar arrays de bytes de manera manual con riesgos de seguridad:

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main () {
  5.  std::string cadena;
  6.  
  7.  std::cout << "Introducir una linea de texto: ";
  8.  std::getline (std::cin, cadena);
  9.  std::cout << "cadena = " << cadena << std::endl;
  10.  
  11.  return 0;
  12. }

Saludos.


« Última modificación: 17 Julio 2021, 22:19 pm por WHK » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Leer un string con memoria dinámica ?
« Respuesta #2 en: 17 Julio 2021, 23:56 pm »

C separa la memoria en diferentes secciones para un programa. Está la pila (stack), el montón (heap), variables locales y estáticas, sólo lectura y memoria de programa. Las variables locales y los arrays (dentro de las funciones) van a la stack y de eso se encarga C de adquirir y liberar la memoria.
De hecho una vez compilado las variables de este tipo no existen: todo son operaciones con aritmética de punteros sobre el registro Base Pointer y por eso no se puede liberar memoria con free.

La que sí debes liberar es la memoria dinámica, que se guarda en el montón (heap). Lo único que hace allí C es adquirir tantos bytes como le has pedido, además de una cierta metainformación, y guarda en una tabla interna todo esto y te devuelve la dirección de memoria del inicio de memoria. Lo único que hará es mantener desde el inicio tantos bytes como lo has solicitado para que otra petición de memoria del montón no la pise. C no quiere saber nada más: si la pierdes, si la sobreescribes, lo que sea, C va a mantener esa memoria como 'ocupada' hasta que la liberes. Y por eso la memoria del montón sí debe ser liberada: le debes decir a C que elimine esa entrada de la tabla porque él no sabe, ni le importa, qué estás haciendo con ella.
En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Leer un string con memoria dinámica ?
« Respuesta #3 en: 18 Julio 2021, 21:35 pm »

@WHK , @MAFUS

muchas gracias por sus respuestas  :)

Entiendo que entonces no es posible liberar esa memoria ocupada por el arreglo estático auxiliar...? Me llama la atención porque aunque se quiera hacer que el usuario introduzca una cadena de cuantos caracteres quiera, al final habria un limite del estático...
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Leer un string con memoria dinámica ?
« Respuesta #4 en: 19 Julio 2021, 00:41 am »

No la liberas a mano. De esa se encarga C. Por eso si intentas liberar con free te saltará el error. Y no, la memoria puedes hacer una cadena tan larga como quieras. En los sistemas modernos el propio sistema no te dejará porque impide que los programas escriban o lean en direcciones de memoria que no están autorizados. En sistemas sin protección podrías escribir una cadena tan larga que podría sobreescribir cualquier parte de la memoria, y eso eran los ataques de buffer overflow.
En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Leer un string con memoria dinámica ?
« Respuesta #5 en: 19 Julio 2021, 03:46 am »

No la liberas a mano. De esa se encarga C. Por eso si intentas liberar con free te saltará el error. Y no, la memoria puedes hacer una cadena tan larga como quieras. En los sistemas modernos el propio sistema no te dejará porque impide que los programas escriban o lean en direcciones de memoria que no están autorizados. En sistemas sin protección podrías escribir una cadena tan larga que podría sobreescribir cualquier parte de la memoria, y eso eran los ataques de buffer overflow.

Comprendo, quedo clarisimo.  Gracias viejo!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Memoria dinámica
Programación C/C++
eleon 6 5,077 Último mensaje 24 Enero 2012, 22:17 pm
por Eternal Idol
Alocacion dinamica de memoria; String, ¿Que estoy haciendo mal?
Programación C/C++
astinx 2 2,574 Último mensaje 4 Junio 2012, 02:15 am
por astinx
Memoria dinamica? « 1 2 »
Programación C/C++
vangodp 11 5,802 Último mensaje 30 Abril 2014, 12:35 pm
por vangodp
Memoría dinámica
Programación C/C++
Developer Diego 4 2,714 Último mensaje 20 Mayo 2014, 23:10 pm
por Developer Diego
Problemas de perdida de memoria con memoria dinamica
Programación C/C++
ing_maipu 1 2,332 Último mensaje 28 Octubre 2017, 18:48 pm
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines