Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Agregar más espacio a un char

Estas en el tema de Agregar más espacio a un char en el foro de C/C++ en Foros del Web. Buenos días. Necesito ayuda, tengo un CHAR la cual tengo que abrirle dependiendo de las necesidades más espacio con memoria dinamica, el problema es que ...
  #1 (permalink)  
Antiguo 02/12/2012, 12:47
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 5 meses
Puntos: 13
Agregar más espacio a un char

Buenos días. Necesito ayuda, tengo un CHAR la cual tengo que abrirle dependiendo de las necesidades más espacio con memoria dinamica, el problema es que no funciona. Solo me almacena el último dato.

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <dirent.h>
  5. #include <string.h>
  6.  
  7. #define PATH_PORTS "/usr/ports/"
  8.  
  9. int main(int argc, char *argv[]) {
  10.     DIR* PORTS_DIRECTORY;
  11.         struct dirent *PORTS_FILES;
  12.        
  13.         char* PORTS;
  14.         int PORTS_SIZE = 0;
  15.  
  16.         if ((PORTS_DIRECTORY = opendir(PATH_PORTS)) != NULL) {
  17.                 while ((PORTS_FILES = readdir(PORTS_DIRECTORY)) != NULL) {
  18.                         if (*PORTS_FILES->d_name == '.') {
  19.                                 continue; }
  20.  
  21.                         PORTS = malloc((strlen(PORTS_FILES->d_name)+PORTS_SIZE)*sizeof(char)); // I need add in the array more space, but only add the last date from PORTS_FILES->d_name
  22.                         PORTS_SIZE = strlen(PORTS_FILES->d_name);
  23.                         strcat(PORTS, PORTS_FILES->d_name) }}
  24.  
  25.         printf("%s", PORTS); }
  #2 (permalink)  
Antiguo 03/12/2012, 16:31
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 7 meses
Puntos: 73
Respuesta: Agregar más espacio a un char

Cada vez que asignas memoria con malloc obtienes un bloque de memoria nuevo, perdiendo lo que tenías en el antiguo, además estás perdiendo la memoria ya reservada, y esto ocurre en cada iteración del bucle.

La función que necesitas es realloc:

void *realloc(void *ptr, size_t size);

Esta función cambia la cantidad de memoria reservada a la que apunta ptr. Si el nuevo tamaño es mayor que el antiguo, se conserva lo que contenía el bloque antiguo y el resto queda con contenido indefinido. Si el tamaño es menor que el antiguo, se conserva hasta ese punto. La variable puntero antigua y la nueva pueden ser la misma, es decir, puedes poner

miPuntero = realloc(miPuntero, nuevo_tamanyo);

Y no olvides liberar la memoria reservada con free cuando ya no la necesites.

Saludos,
  #3 (permalink)  
Antiguo 03/12/2012, 20:48
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 5 meses
Puntos: 13
Respuesta: Agregar más espacio a un char

Muchisimas gracias Fw, tengo una duda referente al tema. Leí un poco acerca de realloc, logre hacero funcionar pero guiandome por otro ejemplo, por lo tanto no entiendo por que funciona así y a mi modo no.


Así fue como lo hice funcionar pero dejandome llevar por otro ejemplo.
Código C:
Ver original
  1. int main(int argc, char *argv[]) {
  2.     DIR* PORTS_DIRECTORY;
  3.     struct dirent *PORTS_FILES;
  4.    
  5.     char *PORTS;
  6.     int PORTS_SIZE = 0;
  7.  
  8.     if ((PORTS_DIRECTORY = opendir(PATH_PORTS)) != NULL) {
  9.         while ((PORTS_FILES = readdir(PORTS_DIRECTORY)) != NULL) {
  10.             if (*PORTS_FILES->d_name == '.') {
  11.                 continue; }
  12.            
  13.             if (PORTS_SIZE == 0) {
  14.                 PORTS = realloc(NULL, strlen(PORTS_FILES->d_name));
  15.                 strcat(PORTS, PORTS_FILES->d_name); }
  16.             else {
  17.                 PORTS = realloc(PORTS, strlen(PORTS_FILES->d_name)+PORTS_SIZE);
  18.                 strcat(PORTS, PORTS_FILES->d_name); }
  19.  
  20.             PORTS_SIZE += strlen(PORTS_FILES->d_name); }}
  21.  
  22.     printf("%s", PORTS); }

Y así es a mi forma que no funciona.

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <dirent.h>
  5. #include <string.h>
  6.  
  7. #define PATH_PORTS "/usr/ports/"
  8.  
  9. int main(int argc, char *argv[]) {
  10.     DIR* PORTS_DIRECTORY;
  11.     struct dirent *PORTS_FILES;
  12.    
  13.     char* PORTS;
  14.     int PORTS_SIZE = 0;
  15.  
  16.     if ((PORTS_DIRECTORY = opendir(PATH_PORTS)) != NULL) {
  17.         while ((PORTS_FILES = readdir(PORTS_DIRECTORY)) != NULL) {
  18.             if (*PORTS_FILES->d_name == '.') {
  19.                 continue; }
  20.  
  21.             PORTS = realloc(PORTS, strlen(PORTS_FILES->d_name)+PORTS_SIZE);
  22.             PORTS_SIZE += strlen(PORTS_FILES->d_name);
  23.             strcat(PORTS, PORTS_FILES->d_name); }}
  24.  
  25.     printf("%s", PORTS);
  26.     free(PORTS); }

¿Tengo que asignarle algo a PORTS antes de usar realloc? iniciandole algo tampoco me funciona.


Saludos.
  #4 (permalink)  
Antiguo 04/12/2012, 02:21
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 7 meses
Puntos: 73
Respuesta: Agregar más espacio a un char

El problema puede estar en la variable PORTS (declarada como puntero a char). Dado que no hay ninguna garantía de que al declarar de una variable se le asigne automáticaente el valor 0 (o NULL, en el caso de punteros), antes de utilizar un puntero con realloc conviene asegurarse de alguna de estas dos cosas:

1. Que se le haya asignado previamente un bloque de memoria mediante malloc o calloc.
2. Que ese puntero valga NULL.

El comportamiento de la función realloc, cuando le pasas un puntero cuyo valor no es NULL ni tiene un bloque de memoria asignado previamente, no está definido. Algunos compiladores pueden detectarlo y utilizarlo como si estuviera inicializado a NULL, pero lo normal es que se intente utilizar el área de memoria a la que apunta de manera aleatoria el puntero no inicializado y ello conduzca al desastre.

Empieza por inicializar el puntero a NULL (por ejemplo, en su declaración en la línea 13, en el programa que no te funciona), en el fondo sería equivalente a lo que hace el código que sí funciona (solo que te ahorrarías un if).

Si sigue sin funcionar, comprueba también que el nuevo tamaño que le quieres asignar es mayor que cero.

Y, en último caso, siempre puedes utilizar ese código que sacaste del ejemplo (ya sabes, si funciona no lo toques...).

Saludos,
  #5 (permalink)  
Antiguo 04/12/2012, 15:44
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 5 meses
Puntos: 13
Respuesta: Agregar más espacio a un char

Simplemente grandioso ¡Genio! inicialice mi puntero con NULL y funciono perfecto. No queria usar la última opción ya que no entender tu propio código seria horrible.


Muchas gracias por la explicación y el tiempo.

Etiquetas: char, espacio, funcion, int, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:08.