[C] - Armado de un array

(1/1)

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

Código
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
#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:
Código
{
 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
 



h0oke:
Esta es la forma en que quiero:

Código
#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):
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



Gallu:
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
#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

Código
#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++;
 }
}

Navegación

[0] Índice de Mensajes