2. PROG-I /18PROG-I
Objetivos
Semana 6
4.1 Definir macros y tipos de datos en C
4.2 Hacer uso de arrays y estructuras
Semana 7
4.3 Tipos de datos definidos por el programador
4.4 Ficheros
Semana 8 y 9
4.5 Punteros y gestión dinámica de memoria
Curso 2009-10Tema 4 - Tipos de datos 2
4. PROG-I /18PROG-I
Problemas arrays
El tamaño del array está prefijado en tiempo
de compilación.
Si el número de elementos de entrada es muy
variable de una ejecución a otra ¿no se podría
reserva memoria en tiempo de ejecución en
función de cuantos elementos quiero
almacenar.
typedef struct {
Elemento e[MAX_ELEM]
int n;
} Vector;
Vector v;
Curso 2009-10 4Tema 4 - Tipos de datos
5. PROG-I /18PROG-I
Reserva memoria dinámica
malloc, calloc: procedimiento que
reseva dinámicamente (tiempo de
ejecución) memoria para almacenar
una variable del tipo puntero.
free: libera la memoria reservada
anterioremente.
NULL: valor que representa una
dirección de memoria vacía.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * pa;
pa = (int *) malloc(sizeof(int));
*pa = 54;
printf("%dn", *pa); /*???*/
free(pa);
pa = NULL;
return 0;
}
ee
punteros3.c
main
heap
int * pa;
papa
Curso 2009-10 5Tema 4 - Tipos de datos
6. PROG-I /18PROG-I
malloc, calloc: procedimiento que
crea dinámicamente (tiempo de
ejecución) memoria para almacenar
una variable del tipo puntero.
free: libera la memoria reservada
anterioremente.
NULL: valor que representa una
dirección de memoria vacía.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * pa;
pa = (int *) malloc(sizeof(int));
*pa = 54;
printf("%dn", *pa); /*???*/
free(pa);
pa = NULL;
return 0;
}
ee
punteros3.c
main
papa
heap
????
pa = (int *) malloc(sizeof(int));
Reserva memoria dinámica
Curso 2009-10 6Tema 4 - Tipos de datos
7. PROG-I /18PROG-I
malloc, calloc: procedimiento que
crea dinámicamente (tiempo de
ejecución) memoria para almacenar
una variable del tipo puntero.
free: libera la memoria reservada
anterioremente.
NULL: valor que representa una
dirección de memoria vacía.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * pa;
pa = (int *) malloc(sizeof(int));
*pa = 54;
printf("%dn", *pa); /*???*/
free(pa);
pa = NULL;
return 0;
}
ee
punteros3.c
main
heap
*pa = 54;
papa
5454
Reserva memoria dinámica
Curso 2009-10 7Tema 4 - Tipos de datos
8. PROG-I /18PROG-I
malloc, calloc: procedimiento que
crea dinámicamente (tiempo de
ejecución) memoria para almacenar
una variable del tipo puntero.
free: libera la memoria reservada
anterioremente.
NULL: valor que representa una
dirección de memoria vacía.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * pa;
pa = (int *) malloc(sizeof(int));
*pa = 54;
printf("%dn", *pa); /*???*/
free(pa);
pa = NULL;
return 0;
}
ee
punteros3.c
main
heap
*pa = 54;
papa
5454
Reserva memoria dinámica
Curso 2009-10 8Tema 4 - Tipos de datos
9. PROG-I /18PROG-I
malloc, calloc: procedimiento que
crea dinámicamente (tiempo de
ejecución) memoria para almacenar
una variable del tipo puntero.
free: libera la memoria reservada
anterioremente.
NULL: valor que representa una
dirección de memoria vacía.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * pa;
pa = (int *) malloc(sizeof(int));
*pa = 54;
printf("%dn", *pa); /*???*/
free(pa);
pa = NULL;
return 0;
}
ee
punteros3.c
main
heap
*pa = 54;
papa
????
Reserva memoria dinámica
Curso 2009-10 9Tema 4 - Tipos de datos
10. PROG-I /18PROG-I
malloc, calloc: procedimiento que
crea dinámicamente (tiempo de
ejecución) memoria para almacenar
una variable del tipo puntero.
free: libera la memoria reservada
anterioremente.
NULL: valor que representa una
dirección de memoria vacía.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * pa;
pa = (int *) malloc(sizeof(int));
*pa = 54;
printf("%dn", *pa); /*???*/
free(pa);
pa = NULL;
return 0;
}
ee
punteros3.c
main
heap
pa = NULL;
papa
NULLNULL
Reserva memoria dinámica
Curso 2009-10 10Tema 4 - Tipos de datos
11. PROG-I /18PROG-I
Reserva y liberación de memoria
malloc: reserva tanto bytes de memoria como se le indica, y devuelve
un puntero. void=tipo genérico
void * malloc(size_t tam);
int * pa;
pa = (int *) malloc(sizeof(int));
free: libera el área de memoria referencia por el puntero.
void free(void *ptr);
free(pa);
calloc: reserva espacio para un array de nelem elementos de tamaño
eltam. Inicializa los elementos del array a cero.
void * calloc(size_t nelem, size_t eltam);
realloc: cambia el tamaño del espacio apuntado por ptr al nuevo
tamaño tam.
void * realloc(void *ptr, size_t tam);
Curso 2009-10 11Tema 4 - Tipos de datos
12. PROG-I /18PROG-I
Arrays memoria estática vs
dinámica
Curso 2009-10Tema 4 - Tipos de datos 12
ee
punteros3.c
main
heap
v2 = (int *) calloc(dim, sizeof(int));
v1v1
11
Estática:
int v1 []={1,2,3};
Dinámica:
int* v2;
int dim;
scanf("%d", &dim); /* suponemos 3 */
v2 = (int *) calloc(dim, sizeof(int));
/*
v2 =(int *) malloc(dim*sizeof(int));
*/
…
free(v2); /*elimina toda la mem.*/
v2 es un puntero al primer elemento
*v2 v2[0]
22 33
v2v2
00 00 00
13. PROG-I /18PROG-I
Arrays memoria estática vs
dinámica
Curso 2009-10Tema 4 - Tipos de datos 13
ee
punteros3.c
main
heap
v1v1
11
Acceso
v2[0] = 3;
v2[1] = 2;
v2[2] = 1;
/* equivalante a */
*v2 = 3;
*(v2+1) = 2;
*(v2+2) = 1;
22 33
v2v2
33 22 11
14. PROG-I /18PROG-I
Arrays memoria estática vs
dinámica
Curso 2009-10Tema 4 - Tipos de datos 14
ee
punteros3.c
main
heap
v1v1
11
v1 ≠ v2 =>
v1++; //ILEGAL
v2++; //PELIGROSO
*(v2+1) = 7;
/* No es equivalante */
v2++;
*v2 = 7
22 33
v2v2
33 22 11
v2++;
15. PROG-I /18PROG-I
Arrays memoria estática vs
dinámica
Curso 2009-10Tema 4 - Tipos de datos 15
ee
punteros3.c
main
heap
v1v1
11
Puntero auxiliar
/* Puntero auxiliar */
int * pt;
pt = v2;
pt++;
*pt = 7;
22 33
v2v2
33 77 11
*pt = 7;
ptpt
16. PROG-I /18PROG-I
Arrays multidimensionales
double a[FIL][COL];
double *a[FIL];
double **a;
a = (double **) malloc(FIL*sizeof(double *));
for (i=0 ; i < FIL; ++i)
a[i] = (double *) malloc(COL*sizeof(double));
. . .
printf("%f", a[1][1]);
a
a
a
for (i=0 ; i < FIL; ++i)
a[i] = (double *) malloc(COL*sizeof(double));
. . .
printf("%f", a[1][1]);
printf("%f", a[1][1]);
Curso 2009-10 16Tema 4 - Tipos de datos
17. PROG-I /18PROG-I
Arrays de cadenas de caracteres
char *meses[] = { "Mes incorrecto", "Enero", "Febrero", "Marzo" };
/* eq. a char *meses[4]; */
M e s i n c o r r e c t o 0
E n e r o 0
F e b r e r o 0
M a r z o 0
¿char *meses[4] = char [4][15]?
mesesmeses
Curso 2009-10 17Tema 4 - Tipos de datos
18. PROG-I /18PROG-I
Argumentos de un programa
int main(int argc, char *argv[])
argc: número de argumentos de entrada incluyendo el nombre
del programa.
argv: array que contiene los argumentos del programa como
cadena de caracteres
argv[0]: nombre del programa
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) /*int main(int argc, char **argv)*/
{
float x;
if (argc != 2) {
printf("Uso: %s numero_realn", argv[0]);
exit(1);
}
x = atof(argv[1]);
printf("%s: %.3fn", argv[1], x);
return 0;
}
Curso 2009-10 18Tema 4 - Tipos de datos