Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Tema 4 - Tipos datos avanzados (III)

78 visualizaciones

Publicado el

Tema 4 - Tipos datos avanzados (III)

4.5 Punteros y gestión dinámica de memoria

Publicado en: Educación
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Tema 4 - Tipos datos avanzados (III)

  1. 1. http://www.eps.uam.es/~phaya PROG-I 2009-10 PUNTEROS Y GESTIÓN DINÁMICA DE MEMORIA Tema 4 – 4.5 N U L L 'P' 'H' 'C' lista
  2. 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
  3. 3. Gestión dinámica de la memoria
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×