Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: h0oke en 17 Mayo 2010, 13:48 pm



Título: [C] - Armado de un array
Publicado por: h0oke en 17 Mayo 2010, 13:48 pm
Si quisiera armar un array, pero sólo utilizando punteros, siendo ésta la función:

Código
  1. void _ingreso(int *Lista, int *Cnt);

En la declaración debería reservar memoria para ingresar un elemento verdad?, entiéndase por esto, malloc(), luego de esto, recién podría leer stdin para asignar el valor leído a un puntero inicial, si no me equivoco.

_____________________________________________________________________________________________________
Código
  1. #include <stdio.h>
  2. /* Posible solución, pero que al colocar el último elemento trae consigo un error */
  3. #define SIZE 10
  4.  
  5. int main(){
  6.  int *lista;
  7.  int i;
  8.  lista = malloc(sizeof(int)*10);
  9.  for(i = 0; i < SIZE; i++){
  10.    printf("Ingrese elemento N %d\n",i);
  11.    scanf("%d", lista);
  12.    *lista++;
  13.  }
  14.  free(lista);
  15.  puts("Terminado");
  16.  return 0;
  17. }


Título: Re: [C] - Armado de un array
Publicado por: nicolasblues86 en 17 Mayo 2010, 17:11 pm
Código
  1. {
  2.  int *lista;
  3.  int i;
  4.  
  5.  lista = (int*)malloc(sizeof(int)*10);
  6.  for(i = 0; i < 10; i++)
  7.  {
  8.    printf("Ingrese elemento N %d\n",i);
  9.    scanf("%d", &lista[i]);    
  10.    printf("puntero a punta a : %p\n", lista);
  11.    printf("VALOR DE DICHA DIRECCION de mem: %d\n", lista[i]);  
  12.  
  13.  }
  14.  
  15.  free(lista);
  16.  puts("Terminado");
  17.  
  18.  
  19. return 0;
  20. }
  21.  



así funciona joya, no se si es de la manera que querías


Saludos
 





Título: Re: [C] - Armado de un array
Publicado por: h0oke en 18 Mayo 2010, 12:47 pm
Esta es la forma en que quiero:

Código
  1. #include <stdio.h>
  2.  
  3. #define SIZE 5
  4.  
  5. int main(){
  6.  int *lista;
  7.  int i;
  8.  lista = (int*)(malloc(sizeof(int)*6));
  9.  *lista = (int)NULL;
  10.  for(i = 0; i < SIZE ; i++){
  11.    *lista++;
  12.    printf("Ingrese elemento N %d\n",i);
  13.    scanf("%d", lista);
  14.  }
  15.  /*free(lista);*/
  16.  puts("Terminado");
  17.  return 0;
  18. }


Pero:

El compilador lanza el siguiente warning(gcc):
Citar
gcc v.c
v.c: In function ‘main’:
v.c:8: warning: incompatible implicit declaration of built-in function ‘malloc’

Y luego si compilo el código con free, al final tengo un error de segmentación, a qué se debe?

Código:
./a.out 
Ingrese elemento N 0
1
Ingrese elemento N 1
2
Ingrese elemento N 2
3
Ingrese elemento N 3
4
Ingrese elemento N 4
5
Fallo de segmentación





Título: Re: [C] - Armado de un array
Publicado por: Gallu en 18 Mayo 2010, 15:26 pm
En primer lugar debes agregar el include <stdlib.h>
En segundo lugar no puedes incrementar directamente el puntero lista , estarías perdiendo la dirección del primer elemento , para el ejemplo que propones , yo utilizaria un puntero auxiliar que recorriera los elementos de lista, fíjate en los cambios
Como la función malloc devuelve la dirección del principio del bloque de memoria reservado , si haces lista++ estarías perdiendo la dirección de esa parte , por consiguiente , al intentar hacer el free lista apuntaría a la última parte del bloque , estarías intentando liberar un bloque de memoria que no te corresponde , de allí el fallo de segmentación .

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>                  //esto para que no te de el warning
  3.  
  4. #define SIZE 5
  5.  
  6. int main(){
  7.  int *lista;
  8.  int *aux;                                          //puntero auxiliar
  9.  int i;
  10. lista = (int*)(malloc(sizeof(int)*6));
  11. aux = lista;                                    //auxililar apunta al primer elemento de lista
  12.  *lista = (int)NULL;
  13.  for(i = 0; i < SIZE ; i++){
  14.   //  cambio de lugar el incremento , de esa manera tambien rellenas el elemento 0
  15.    printf("Ingrese elemento N %d\n",i);
  16.    scanf("%d", aux);
  17.    aux++;                                    // incrementamos auxiliar
  18.  }
  19.  
  20. // en este punto lista ya tiene información
  21. //con esto muestras la informacion en lista
  22.  int cont = 0;
  23.  printf("\nInformación en lista ");
  24.  while (cont < SIZE) printf("\n%d", lista[cont++]);
  25.  
  26.  
  27.  free(lista);                         //liberamos lo que habiamos reservado
  28.  puts("Terminado");
  29.  return 0;
  30. }

ahora que si lo haces dentro de una función , no necesitas ningún puntero auxiliar

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define SIZE 5
  5.  
  6. void llenar_array(int *ptr_array);
  7.  
  8. int main(){
  9.  int *lista;
  10.  lista = (int*)(malloc(sizeof(int)*6));
  11.  
  12.  llenar_array(lista);
  13.  
  14.  //con esto muestras la informacion en lista
  15.  int cont = 0;
  16.  printf("\nInformación en lista ");
  17.  while (cont < SIZE) printf("\n%d", lista[cont++]);
  18.  
  19.  free(lista);
  20.  puts("\nTerminado");
  21.  return 0;
  22. }
  23.  
  24. void llenar_array(int *ptr_array){
  25. int i;
  26. for(i = 0; i < SIZE ; i++){
  27. printf("Ingrese elemento N %d\n",i);
  28. scanf("%d", ptr_array);
  29. ptr_array++;
  30.  }
  31. }