Memoria Dinámica Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez.

Slides:



Advertisements
Presentaciones similares
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Introducción a C Sistemas Operativos.
Advertisements

Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Introducción a C Sistemas Operativos.
Direcciones, Arreglos y Argumentos de Funciones
Funcionamiento, programación
Unidad 3 Punteros.
Herramientas para el acceso directo a memoria en C++
APUNTADORES EN C. MENU DEL DIA Repaso clase anterior Apuntadores. Eso pa que? Solución al problema: Funciones. Ventajas de trabajar un programa usando.
Estructuras.
PUNTEROS Ing Anghello Quintero.
Informática Ingeniería en Electrónica y Automática Industrial
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
TEORIA DE LA INFORMACION INGENIERO ANYELO QUINTERO.
Informática Ingeniería en Electrónica y Automática Industrial
Programación en C para electrónicos
PUNTEROS Y REFERENCIAS
APUNTADORES.
Los punteros Programación modular.
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings
Paso de Parámetros a una Función Prof. Flor Narciso Departamento de Computación Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de.
MEMORIA DINÁMICA.
Tema 1. Estructuras de datos Objetivo: Objetivo: El alumno resolverá problemas de almacenamiento, recuperación y ordenamiento de datos y las técnicas de.
FUNDAMENTOS DE PROGRAMACIÓN VARIABLES, CONSTANTES Y TIPOS DE DATOS EN C.
PROF. RAFAEL MONTENEGRO B. UNELLEZ-APURE Introducci Ó n a los Arreglos (“arrays”) en C++
Introducción al Lenguaje C (II) Cadenas de caracteres, archivos de cabecera, lectura y escritura Fundamentos de Programación Departamento de Lenguajes.
Introducción al Lenguaje C (I) Tipos básicos, arrays y punteros Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión
Funciones y paso de parámetros Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Unidad Didáctica 24.
AYUDANTÍA 2 Lenguaje Imperativo y Java. Punteros Dirección a memoria (puede apuntar a NULL). Permite trabajar con memoria (variables dinámicas de heap).
Estructura_clase Ing. Eduard Antonio Lozano Córdoba.
Introducción a punteros en C
El lenguaje de Programación C Fernando J. Pereda.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
Grupo de Usuarios de Linux
Programación en C - manejo de Archivos
Arreglos y cadenas de texto
Arreglos (Arrays) Programación 1.
Métodos y parámetros.
Informática Ingeniería en Electrónica y Automática Industrial
Algunas Características de C++ no presentes en C
Polimorfismo y Métodos Virtuales
Manejo de Punteros y objetos en memoria dinámica en C++
Conceptos básicos de programación
FUNCIONES Y PROCEDIMIENTOS
TIPOS DE DATOS Cadenas y caracteres PARCIAL III.
Métodos en Java.
Algunas Características de C++ no presentes en C
Arreglos. en Lenguaje C n
Guía teórica de manejo de estructuras de datos
Algunas Características de C++ no presentes en C
Manejo de Punteros y objetos en memoria dinámica en C++
Definición y Conversión de datos
LENGUAJE DE PROGRAMACION III Estructuras Estáticas de Datos
Estructuras Estructuras En la creación de soluciones para algunos problemas surge la necesidad de agrupar datos de diferente tipo o de manejar datos que.
Unidad 3 Punteros.
LENGUAJE C.
Programación I MC José Andrés Vázquez Flores
Algunas ideas básicas de C++
Estructuras de Datos Dinámicas
Fundamentos de Informática Especialidad de Electrónica –
PUNTEROS EN EL LENGUAJE C
Informática Ingeniería en Electrónica y Automática Industrial
Curso de Programación Estructurada
Informática Ingeniería en Electrónica y Automática Industrial
Informática Ingeniería en Electrónica y Automática Industrial
Tema 5: Matrices Antonio J. Sierra.
Informática Ingeniería en Electrónica y Automática Industrial
Algunas Características de C++ no presentes en C
Informática Ingeniería en Electrónica y Automática Industrial
Manejo de Punteros y objetos en memoria dinámica en C++
INTRODUCCIÓN AL LENGUAJE C++
Memoria estática versus dinámica con Estructuras
Transcripción de la presentación:

Memoria Dinámica Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

2 Memoria Dinámica 1. PUNTEROS 2. MEMORIA DINÁMICA

3 Memoria Dinámica 1. PUNTEROS

4 Memoria Dinámica ¿Qué es un puntero? Un tipo de variable cuyo valor es la dirección de memoria de otra variable. int x = 25; - La dirección de la variable x (&x) es El contenido de la variable x es x in t

5 Memoria Dinámica Reglas por las que se rigen los punteros Un puntero es una variable como cualquier otra. Una variable puntero contiene una dirección que apunta a otra posición en memoria. En esa posición se almacenan los datos a los que apunta el puntero. Un puntero apunta a otra variable de memoria.

6 Memoria Dinámica Declaración de punteros * ; int *p; char *p1; float *p2;

7 Memoria Dinámica Operadores de punteros

8 Memoria Dinámica Inicialización de Punteros Estática Dinámica

9 Memoria Dinámica Se asigna memoria estáticamente definiendo una variable. Se declara el puntero. El puntero apunta al valor de la variable. Int x = 25; int *p; p = &x; Inicialización Estática

10 Memoria Dinámica int *p; *p = 50; /*error px no contiene dirección */ ERRORSOLUCIÓN int x = 50; int *p; p = &x;

11 Memoria Dinámica float *p; char *c; p = &c; /* no es válido */ ERRORSOLUCIÓN /* c y p tienen que ser del mismo tipo * /

12 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

13 Memoria Dinámica TIPOS DE PUNTEROS Puntero a una función Puntero a una estructura

14 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

15 Memoria Dinámica PUNTEROS ESPECIALES PUNTERO NULL PUNTERO VOID

16 Memoria Dinámica PUNTERO NULL No apunta a ninguna parte. No direcciona ningún dato válido en memoria. Lo podemos definir: Macro → #DEFINE NULL 0 Librerias → stdef.h stdio.h stdlib.h string.h Ej: char *p = NULL; PUNTERO VOID Apunta a cualquier tipo de dato Direcciona cualquier posición en memoria Se puede igualar a nulo si no direcciona ningún dato válido; Ej: void *p; void *ptr = NULL;

17 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

18 Memoria Dinámica Punteros a punteros Puntero que apunta a otra variable puntero. int a=20; int * p1=&a; /* Puntero a entero */ int ** p2=&p1; /* Puntero a puntero entero */ *p1=25; **p2=50;

19 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

20 Memoria Dinámica Punteros y Arrays Un nombre de array es simplemente un puntero. int vector[4] = {20,40,60,80} ; [0] [1] [2] [3] vector*vector = *(vector+ 0) *(vector + 1) *(vector + 2) *(vector + 3)

21 Memoria Dinámica float v[10]; float x = 100.5; v = &x; /* ERROR intento modificar un puntero constante */ ERRORSOLUCIÓN v[a i ] = x | a i < 10 Asignar x a una variable puntero.

22 Memoria DinámicaMORALEJA NOMBRE DE ARRAY = CONSTANTE PUNTERO != VARIABLE PUNTERO No se puede cambiar el valor del nombre de un array durante la ejecución de un programa

23 Memoria Dinámica char *cadena;.. cadena= ”Hola”; /* ERROR*/ ERRORSOLUCIÓN char * cadena = ”Hola”; ó malloc() + strcpy()

24 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

25 Memoria Dinámica Arrays de punteros Array que contiene como elementos punteros, cada uno apunta a un tipo de datos específico. int *p[10]; /* Array de 10 punteros a enteros*/ char *vector[25]; /*Array de 25 punteros a carácter*/ int (*p1)[]; → /*Puntero a un array de enteros*/ [0] [1][0][2][3]

26 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

27 Memoria Dinámica Punteros de cadenas Los punteros se pueden utilizar en lugar de índices de arrays. [1][0][2][3] P

28 Memoria Dinámica char cadena[4]=”gul”; char * p; p = &cadena[0]; /* p= cadena */ printf(”%c \n”,*p); p=&cadena; /* ERROR tipo de asignacion incompatible */ ERROR

29 Memoria Dinámica TIPOS DE PUNTEROS Punteros Especiales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

30 Memoria Dinámica Punteros como argumento de funciones Paso por valor Paso por valor – no se puede cambiar el valor de la variable. Paso por referencia Paso por referencia - Se puede cambiar el valor de la variable.

31 Memoria Dinámica ● En C por defecto, el paso de parámetros se hace por valor

32 Memoria Dinámica ● C no tiene parámetros por referencia Solución → PUNTEROS (pasando la dirección de una variable)

33 Memoria Dinámica void funcion ( int * a, int b){ *a = 5; b = 25; }; Ejemplo /* invocación a la función*/ int x =1; int y = 2; funcion (&x,y);

34 Memoria Dinámica TIPOS DE PUNTEROS Puntero a una función Puntero a una estructura

35 Memoria Dinámica Punteros a funciones Apuntan a código ejecutable, en lugar de direccionar datos. (*PunteroaFuncion) ( ); p f int func(int); int (*pf)(int); pf=f;

36 Memoria Dinámica Utilidad Pasar una función como argumento a otra función. ¡Cuidado! La función debe tener el mismo tipo de retorno y lista de parámetros. int fa(int i, int j){ return i+j; ); /* decalaración */ void mifuncion( int (*fa)(int,int) ); /* llamada */ mifuncion(fa);

37 Memoria Dinámica TIPOS DE PUNTEROS Puntero a una función Puntero a una estructura

38 Memoria Dinámica Punteros a estructuras Se declara igual que declaramos un puntero a cualquier otro tipo de objeto struct persona { char nombre [30]; int edad; } struct persona p1 = {”Elena”,20}; Acceso a través de la estructura p1.nombre struct persona * p; p = &p1; Acceso a través del puntero a estructura p1-> nombre *(p1).nombre

39 Memoria Dinámica 2. MEMORIA DINÁMICA

40 Memoria Dinámica ¿Punteros o Memoria Dinámica? Los punteros y la memoria dinámica están muy relacionados... pero no siempre van juntos. Podemos trabajar con punteros sin memoria dinámica. ¿Ejemplo? Parámetros por referencia Arrays estáticos

41 Memoria Dinámica ¿Qué es la Memoria Dinámica? Memoria que reservamos durante la ejecución de nuestro programa.

42 Memoria Dinámica ¿Y dónde se almacena esa MEMORIA? En una zona del mapa de memoria llamada... ALMACÉN LIBRE

43 Memoria Dinámica Mapa de memoria de un programa Cada segmento de código, dato o pila se limita a 64 k Memoria alta Memoria baja Segmento de datos

44 Memoria Dinámica ¿Y las variables? Hay que distinguir.. Variables globales Variables locales Variables estáticas

45 Memoria Dinámica Mapa de memoria de un programa Memoria alta Memoria baja Variables globales no inicializadas Variables globales inicializadas Variables locales ( parámetros de funciones.. ) Variables estáticas

46 Memoria Dinámica ¿Cómo gestionar esa MEMORIA? Asignar memoria Liberar memoria

47 Memoria Dinámica Funciones de Gestión de Memoria Función MALLOC () Función CALLOC () Función REALLOC () Función FREE () ASIGNACIÓN LIBERACIÓN

48 Memoria Dinámica Funciones de Gestión de Memoria Función malloc() Función free()

49 Memoria Dinámica Función malloc() Asigna bloques de memoria ¿Qué devuelve esta función? La dirección de memoria donde comienza la reserva realizada ó NULL. ¿Qué parámetros necesita? El tamaño de la memoria a reservar en bytes Muy útil → SIZEOF() #include void *malloc( size_t size );

50 Memoria Dinámica /* Reserva memoria para un entero */ int *p; p = (int *)malloc(sizeof(int)); (*p)=5; Ejemplo /* Reserva memoria para una array de 5 enteros */ int *p; p = (int *)malloc(sizeof(int) *5 ); (*p)=5;

51 Memoria DinámicaRECOMENDACIÓN /* COMPROBAR EL VALOR DEVUELTO POR MALLOC*/ /* COMPROBAR EL VALOR DEVUELTO POR MALLOC*/ int *p; p = (int *)malloc(sizeof(int) *5 ); If ( p == NULL ) { If ( p == NULL ) { puts ( ”Error en la asignación de memoria”); puts ( ”Error en la asignación de memoria”); return (-1); return (-1); } (*p)=5;

52 Memoria Dinámica int num; scanf (”%d”,&num); int vector[num]; /* ERROR el valor de num es desconocido en tiempo de compilación*/ ERROR SOLUCIÓN int num; int * vector; scanf (”%d”,&num); vector = (int*) malloc(num*sizeof(int); malloc(num*sizeof(int);

53 Memoria Dinámica Funciones de Gestión de Memoria Función malloc() Función calloc() Función realloc() Función free()

54 Memoria Dinámica Función calloc() Reserva memoria Inicializa la memoria a 0. ¿Qué devuelve esta función? La dirección de memoria donde comienza la reserva realizada ó NULL. ¿Qué parámetros necesita? Numero de elementos a reservar Tamaño en bytes del tipo de elemento. #include void *calloc( num_eltos,size_elto );

55 Memoria Dinámica Funciones de Gestión de Memoria Función malloc() Función calloc() Función realloc() Función free()

56 Memoria Dinámica Función realloc() Permite reservar un bloque de memoria reservado anteriormente. Aconsejable hacer conversión a tipo puntero: Tipo Tipo * puntero; (tipo *) Puntero = (tipo *) realloc (ptr_a_bloque, tam_total nuevo bloque ) #include void *realloc(ptr_a_bloque, tam_total nuevo bloque)

57 Memoria Dinámica Funciones de Gestión de Memoria Función malloc() Función calloc() Función realloc() Función free()

58 Memoria Dinámica Función free() Liberar memoria previamente asignada. El bloque de memoria suprimido se devuelve al montículo o almacén libre. #include void free( void *ptr );

59 Memoria Dinámica /* COMO RESERVAR Y LIBERAR MEMORIA CON CADENAS */ /* COMO RESERVAR Y LIBERAR MEMORIA CON CADENAS */ char cad[100], *p; puts(”Introduce una frase”); gets(cad); p = (char*) malloc ( (strlen(cad)+1) * sizeof(char) ); strcpy(p,cad); free(p);

60 Memoria Dinámica ● Siempre que se llama a malloc hay que llamar a.. free(p); RECOMENDACIÓN

61 Memoria Dinámica ¿Y qué es ese famoso SEGMENTATION FAULT? Violación de segmento de memoria. Se produce cuando accedemos a una posición de memoria indebida. ¿Cómo corregirlo? Gestionando la memoria adecuadamente.

62 Memoria Dinámica int *p; int x = 1; p = &x; free (p); Segmentation Fault No podemos liberar memoria que previamente no fue asignada con malloc.

63 Memoria Dinámica int *p1,p2; p1 = (int*) malloc(int); *p1 = 1; p2 = p1; free(p1); Segmentation Fault No podemos dejar punteros colgados (dangling)

64 Memoria Dinámica int *p1 = (int*) malloc(sizeof(int)); int *p2 = (int*) malloc(sizeof(int)); *p1 = 5; *p2 = 10; p2 = p1; Segmentation Fault Debemos evitar la pérdida de memoria asignada

65 Memoria Dinámica Dudas y sugerencias, consultar a: Grupo de Usarios de Linux – Carlos III de Madrid (Leganés): Lista correo GUL UC3M: DESPACHO GUL: 2.3C05 (Ed. Sabatini) (Segundo viernes de cada mes)

66 Memoria Dinámica FIN