Discussion:
Punteros. Preguntas dentro del codigo.
(demasiado antiguo para responder)
Olaf "El Blanco"
2006-02-04 15:24:54 UTC
Permalink
Empiezo con el tema...
Y si ves alguna mala costumbre, házmela saber.
¿Como puedo saber antes de ejecutar el código, si había o no memoria
suficiente?


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

/* Carga un vector con enteros aleatorios. Devuelve la cantidad que han
cargado */
int carga_datos_a(int *EsteVector)
{
int cantidad, i;
printf ("Se cargará el vector con enteros aleatorios\n");
printf ("Ingrese la cantidad de elementos:\n");
printf ("--> ");
scanf ("%d", &cantidad);
EsteVector = (int*)malloc(cantidad * sizeof(int));
for (i=0; i<cantidad; i++)
*(EsteVector + i) = rand();
return cantidad;
}

/* Imprime Elemento del vector, direccion de celda de memoria, contenido */
void mostrar(int *EsteVector, int cantidad)
{
int i;
for (i=0; i<cantidad; i++)
/* Los int ocupan 2 bytes. */
printf ("%3d\t\t%10u\t\t%20d\n", i, &EsteVector + i + 2 ,
*(EsteVector + i));
}

int main()
{
int *vector;
int c;
/*
¿Porque en 'carga_datos' paso directamente el nombre del vector, o sea
la
direccion del primer elemento??? Y en 'mostrar' tengo que ponerle un
&??
*/
c = carga_datos_a(vector);
/* Carga datos al vector y decime cuantos datos quisieron cargarle */
mostrar(&vector, c);
/* Muestra el vector con la cantidad que te devuelve la anterior funcion
*/

free (vector);
system("PAUSE");
return 0;
}
Olaf "El Blanco"
2006-02-04 15:44:57 UTC
Permalink
Ahora me doy cuenta que no le estoy ingresando elementos...
Los números que imprime son basura.
¿Porque sucede esto?
Post by Olaf "El Blanco"
Empiezo con el tema...
Y si ves alguna mala costumbre, házmela saber.
¿Como puedo saber antes de ejecutar el código, si había o no memoria
suficiente?
#include <stdio.h>
#include <stdlib.h>
/* Carga un vector con enteros aleatorios. Devuelve la cantidad que han
cargado */
int carga_datos_a(int *EsteVector)
{
int cantidad, i;
printf ("Se cargará el vector con enteros aleatorios\n");
printf ("Ingrese la cantidad de elementos:\n");
printf ("--> ");
scanf ("%d", &cantidad);
EsteVector = (int*)malloc(cantidad * sizeof(int));
for (i=0; i<cantidad; i++)
*(EsteVector + i) = rand();
return cantidad;
}
/* Imprime Elemento del vector, direccion de celda de memoria, contenido */
void mostrar(int *EsteVector, int cantidad)
{
int i;
for (i=0; i<cantidad; i++)
/* Los int ocupan 2 bytes. */
printf ("%3d\t\t%10u\t\t%20d\n", i, &EsteVector + i + 2 ,
*(EsteVector + i));
}
int main()
{
int *vector;
int c;
/*
¿Porque en 'carga_datos' paso directamente el nombre del vector, o sea
la
direccion del primer elemento??? Y en 'mostrar' tengo que ponerle un
&??
*/
c = carga_datos_a(vector);
/* Carga datos al vector y decime cuantos datos quisieron cargarle */
mostrar(&vector, c);
/* Muestra el vector con la cantidad que te devuelve la anterior funcion
*/
free (vector);
system("PAUSE");
return 0;
}
Pedro Maicas
2006-02-04 16:46:45 UTC
Permalink
Post by Olaf "El Blanco"
Ahora me doy cuenta que no le estoy ingresando elementos...
Los números que imprime son basura.
¿Porque sucede esto?
Pues porque pasas el puntero de una funcion a otra, la funcion
más "interna" (por decirlo de alguna forma) es la que reserva memoria
y la asigna a ese puntero, pero no lo devuelve, esa funcion lo que
ha recibido como parámetro es una copia del puntero, la funcion
que la llamó no recibe esa copia inicializada.

No se si te das cuenta pero un puntero es como un entero,
una simple variable de cuatro bytes (o los que sean, que no viene
al caso ahora). Seguro que si hubieras pasado un entero como parámetro
no esperarias tener su valor de vuelta, por eso has puesto el entero como
valor de retorno :-)

Y respecto a la otra pregunta, simplemente tras el malloc añade
un if, mira la documentacion de malloc.

Saludos :-) -Pedro-

http://www.maicas.net/

e-mail en www.maicas.net

Loading...