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


 


Tema destacado: [AIO elhacker.NET 2013] Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Duda Punteros Dobles/Array de punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda Punteros Dobles/Array de punteros  (Leído 867 veces)
MisterJava

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Duda Punteros Dobles/Array de punteros
« en: 20 Diciembre 2012, 19:52 »

Buenas tardes.

Tenía una duda sobre la creación de Un array de punteros. Os explico la idea: Tengo que hacer un programa que me devuelva las lineas de entrada en orden inverso, es decir, la ultima linea como la primera, y la primera como la última. Para ello he recurrido a crear lo que viene siendo un puntero doble. Me he tirado toda la tarde intentando buscar una solucion pero no doy con ella, No se que estoy haciendo mal en el código y me sale un Segmentation Fault.

Aqui os muestro el código:

Citar
void delreves(FILE* archivo){
        char string[100];
        char *pointer;
        char **array_pointers;
        int i=0;
        char **aux;
        array_pointers=(char**)malloc(sizeof(char*));
        if(array_pointers==NULL){
                exit(-1);
        }
        int size=1;
        while(!feof(archivo)){
                fgets(string,2048,archivo);
        aux=(char **)realloc(array_pointers,(sizeof(char)*size));
        if(aux!=NULL){
                array_pointers=aux;
        }
        pointer=pointer+i;
        array_pointers=array_pointers+i;
        pointer=strdup(string);
        array_pointers=&pointer;
        size++;
        i++;
        }
}

El problema me surge principalmente al usar el movimiento de punteros, que no se porque no me lo ejecuta bien.

Os agradecería que me ayudarais a entender como usar un puntero doble para que vaya apuntando a cada uno de los punteros con malloc y realloc.

Gracias por vuestro tiempo.


En línea

rir3760


Conectado Conectado

Mensajes: 1.429


Ver Perfil
Re: Duda Punteros Dobles/Array de punteros
« Respuesta #1 en: 23 Diciembre 2012, 04:04 »

El problema principal en esa función es el incremento de la variable "array_pointers", al hacerlo pierdes la dirección base. En su lugar:

1) Reservas el bloque de memoria principal, este lo utilizas para almacenar la dirección de memoria de cada cadena.

2) Utilizas un auxiliar para leer la linea. Para esta reservas un bloque de memoria del tamaño apropiado, copias ahí la cadena y guardas su dirección en el bloque principal.

3) Si el bloque principal se llena reajustas su tamaño con realloc.

La función con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NUM_CHARS  4096
  6.  
  7. void delreves(FILE *entrada);
  8.  
  9. /* ... */
  10.  
  11. void delreves(FILE *entrada)
  12. {
  13.   char temp[NUM_CHARS];
  14.   char **linea;
  15.   int i;
  16.   int max_lineas = 16;
  17.  
  18.   linea = malloc(max_lineas * sizeof *linea);
  19.  
  20.   i = 0;
  21.   while (fgets(temp, NUM_CHARS, entrada) != NULL){
  22.      linea[i] = malloc(strlen(temp) + 1);
  23.      strcpy(linea[i], temp);
  24.      i++;
  25.  
  26.      if (i == max_lineas){
  27.         max_lineas *= 2;
  28.         linea = realloc(linea, max_lineas * sizeof *linea);
  29.      }
  30.   }
  31.  
  32.   linea = realloc(linea, i * sizeof *linea);
  33.  
  34.   /* Procesamiento de las lineas ... */
  35.  
  36.   /* Liberacion de la memoria utilizada */
  37.   while (i-- > 0)
  38.      free(linea[i]);
  39.   free(linea);
  40. }
Por cierto no hay validaciones para reducir en lo posible el código fuente, eso te toca a ti.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
MisterJava

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Duda Punteros Dobles/Array de punteros
« Respuesta #2 en: 30 Diciembre 2012, 20:19 »

El problema principal en esa función es el incremento de la variable "array_pointers", al hacerlo pierdes la dirección base. En su lugar:

1) Reservas el bloque de memoria principal, este lo utilizas para almacenar la dirección de memoria de cada cadena.

2) Utilizas un auxiliar para leer la linea. Para esta reservas un bloque de memoria del tamaño apropiado, copias ahí la cadena y guardas su dirección en el bloque principal.

3) Si el bloque principal se llena reajustas su tamaño con realloc.

La función con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NUM_CHARS  4096
  6.  
  7. void delreves(FILE *entrada);
  8.  
  9. /* ... */
  10.  
  11. void delreves(FILE *entrada)
  12. {
  13.   char temp[NUM_CHARS];
  14.   char **linea;
  15.   int i;
  16.   int max_lineas = 16;
  17.  
  18.   linea = malloc(max_lineas * sizeof *linea);
  19.  
  20.   i = 0;
  21.   while (fgets(temp, NUM_CHARS, entrada) != NULL){
  22.      linea[i] = malloc(strlen(temp) + 1);
  23.      strcpy(linea[i], temp);
  24.      i++;
  25.  
  26.      if (i == max_lineas){
  27.         max_lineas *= 2;
  28.         linea = realloc(linea, max_lineas * sizeof *linea);
  29.      }
  30.   }
  31.  
  32.   linea = realloc(linea, i * sizeof *linea);
  33.  
  34.   /* Procesamiento de las lineas ... */
  35.  
  36.   /* Liberacion de la memoria utilizada */
  37.   while (i-- > 0)
  38.      free(linea[i]);
  39.   free(linea);
  40. }
Por cierto no hay validaciones para reducir en lo posible el código fuente, eso te toca a ti.

Un saludo

Tío, no sé como darte las gracias rir3760.
Esa forma de usar el realloc no se me había ocurrido y llevabamos pillados 1 semana(porque los profesores no explican una m...) y el usar el tamaño de p como contador de aumento de memoria ni me había fijado.

De verdad, GRACIAS! Te debo mi aprobado, puto crack. :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con array de punteros a cadenas
Programación C/C++
Leo Gutiérrez. 2 3,090 Último mensaje 6 Diciembre 2009, 10:16
por nicolas_cof
cadenas y array con punteros
Programación C/C++
mapers 4 2,222 Último mensaje 29 Enero 2010, 00:46
por Leo Gutiérrez.
Array de punteros.
Programación C/C++
soyloqbuskas 3 1,850 Último mensaje 30 Enero 2012, 20:28
por soyloqbuskas
Problema con iterador a lista de punteros
Programación C/C++
SrCooper 4 363 Último mensaje 24 Julio 2013, 15:43
por Eternal Idol
[Ayuda] Vector de punteros a objectos
Programación C/C++
bemone 2 239 Último mensaje 24 Agosto 2013, 19:55
por bemone
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines