[C] - Armado de un array

Iniciado por h0oke, 17 Mayo 2010, 13:48 PM

0 Miembros y 1 Visitante están viendo este tema.

h0oke

Si quisiera armar un array, pero sólo utilizando punteros, siendo ésta la función:

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.

_____________________________________________________________________________________________________

#include <stdio.h>
/* Posible solución, pero que al colocar el último elemento trae consigo un error */
#define SIZE 10

int main(){
  int *lista;
  int i;
  lista = malloc(sizeof(int)*10);
  for(i = 0; i < SIZE; i++){
    printf("Ingrese elemento N %d\n",i);
    scanf("%d", lista);
    *lista++;
  }
  free(lista);
  puts("Terminado");
  return 0;
}


nicolasblues86


{
  int *lista;
  int i;
 
  lista = (int*)malloc(sizeof(int)*10);
  for(i = 0; i < 10; i++)
  {
    printf("Ingrese elemento N %d\n",i);
    scanf("%d", &lista[i]);   
    printf("puntero a punta a : %p\n", lista);
    printf("VALOR DE DICHA DIRECCION de mem: %d\n", lista[i]); 
   
  }
 
  free(lista);
  puts("Terminado");
 

return 0;
}




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


Saludos




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

h0oke

Esta es la forma en que quiero:

Código (c,8,15) [Seleccionar]
#include <stdio.h>

#define SIZE 5

int main(){
 int *lista;
 int i;
 lista = (int*)(malloc(sizeof(int)*6));
 *lista = (int)NULL;
 for(i = 0; i < SIZE ; i++){
   *lista++;
   printf("Ingrese elemento N %d\n",i);
   scanf("%d", lista);
 }
 /*free(lista);*/
 puts("Terminado");
 return 0;
}



Pero:

El compilador lanza el siguiente warning(gcc):
Citargcc 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?

./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





Gallu

#3
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 .


#include <stdio.h>
#include <stdlib.h>                  //esto para que no te de el warning

#define SIZE 5

int main(){
 int *lista;
 int *aux;                                          //puntero auxiliar
 int i;
lista = (int*)(malloc(sizeof(int)*6));
aux = lista;                                    //auxililar apunta al primer elemento de lista
 *lista = (int)NULL;
 for(i = 0; i < SIZE ; i++){
  //  cambio de lugar el incremento , de esa manera tambien rellenas el elemento 0
   printf("Ingrese elemento N %d\n",i);
   scanf("%d", aux);
   aux++;                                    // incrementamos auxiliar
 }

// en este punto lista ya tiene información
//con esto muestras la informacion en lista
 int cont = 0;
 printf("\nInformación en lista ");
 while (cont < SIZE) printf("\n%d", lista[cont++]);


 free(lista);                         //liberamos lo que habiamos reservado
 puts("Terminado");
 return 0;
}


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


#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

void llenar_array(int *ptr_array);

int main(){
 int *lista;
 lista = (int*)(malloc(sizeof(int)*6));
 
 llenar_array(lista);
 
 //con esto muestras la informacion en lista
 int cont = 0;
 printf("\nInformación en lista ");
 while (cont < SIZE) printf("\n%d", lista[cont++]);
 
 free(lista);
 puts("\nTerminado");
 return 0;
}

void llenar_array(int *ptr_array){
int i;
for(i = 0; i < SIZE ; i++){
printf("Ingrese elemento N %d\n",i);
scanf("%d", ptr_array);
ptr_array++;
 }
}
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.