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

 

 


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


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] - Armado de un array
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] - Armado de un array  (Leído 2,425 veces)
h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
[C] - Armado de un array
« 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. }


« Última modificación: 17 Mayo 2010, 14:19 pm por dr.~ » En línea

nicolasblues86

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: [C] - Armado de un array
« Respuesta #1 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
 





En línea

Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no
h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: [C] - Armado de un array
« Respuesta #2 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



En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: [C] - Armado de un array
« Respuesta #3 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. }
« Última modificación: 18 Mayo 2010, 15:59 pm por Didacso » En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ETA anuncia el cese armado.
Foro Libre
тαптяα 0 1,774 Último mensaje 20 Octubre 2011, 21:47 pm
por тαптяα
Un hombre armado se atrinchera con rehenes en una tienda judía en París
Foro Libre
El_Andaluz 0 1,245 Último mensaje 9 Enero 2015, 16:53 pm
por El_Andaluz
Armado de PC para streaming y jugar
Hardware
LuisC24 5 2,666 Último mensaje 17 Junio 2024, 00:57 am
por B€T€B€
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines