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

Memoria Dinámica Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez Memoria Dinámica 1. PUNTEROS 2. MEMORIA DINÁMICA 2 Memoria Dinámica 1. PUNTEROS 3 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; x 1504 25 int - La dirección de la variable x (&x) es 1504 - El contenido de la variable x es 25 4 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. 5 Memoria Dinámica  Declaración de punteros * ; int *p; char *p1; float *p2; 6 Memoria Dinámica  Operadores de punteros OPERADOR PROPÓSITO & Obtiene la dirección de una variable * Define una variable como puntero * Obtiene el contenido de una variable puntero 7 Memoria Dinámica  I nicialización de Punteros  Estática  Dinámica 8 Memoria Dinámica  I nicialización Estática    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; 9 Memoria Dinámica E RROR SOLUCI ÓN int *p; int x = 50; *p = 50; int *p; /*error px no contiene dirección */ p = &x; 10 Memoria Dinámica E RROR float *p; char *c; p = &c; SOLUCI ÓN /* c y p tienen que ser del mismo tipo * / /* no es válido */ 11 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones 12 Memoria Dinámica TI POS DE PUNTEROS   Puntero a una función Puntero a una estructura 13 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones 14 Memoria Dinámica  PUNTEROS ESPECIALES PUNTERO NULL  PUNTERO VOID  15 Memoria Dinámica PUNTERO VOID 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;     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; 16 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones 17 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; 18 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones 19 Memoria Dinámica Punteros y Arrays  Un nombre de array es simplemente un puntero. int vector[4] = {20,40,60,80} ; MEMORIA vector [0] 20 *vector = *(vector+ 0) [1] 40 *(vector + 1) [2] 60 *(vector + 2) [3] 80 *(vector + 3) 20 Memoria Dinámica E RROR float v[10]; SOLUCI ÓN  float x = 100.5;  v = &x; v[ai] = x | ai < 10 Asignar x a una variable puntero. /* ERROR intento modificar un puntero constante */ 21 Memoria Dinámica M ORALE JA No se puede cambiar el valor del nombre de un array durante la ejecución de un programa NOMBRE DE ARRAY = CONSTANTE PUNTERO != VARIABLE PUNTERO 22 Memoria Dinámica E RROR SOLUCI ÓN char *cadena; char * cadena = ”Hola”; .. ó cadena= ”Hola”; malloc() + strcpy() /* ERROR*/ 23 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones 24 Memoria Dinámica Arrays de punteros  [0] [1] [2] [3] 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*/ 25 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones 26 Memoria Dinámica Punteros de cadenas  Los punteros se pueden utilizar en lugar de índices de arrays. P G U L \0 [0] [1] [2] [3] 27 Memoria Dinámica E RROR char cadena[4]=”gul”; char * p; p = &cadena[0]; /* p= cadena */ printf(”%c \n”,*p); p=&cadena; /* ERROR tipo de asignacion incompatible */ 28 Memoria Dinámica TI POS DE PUNTEROS       Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas

0 downloads 100 Views 235KB Size

Recommend Stories


2010 Santiago, 30 de marzo de 2010
Ley 20.417 D O 26/1/2010 D.O. MODIFICA LEY Nº 19.300 SOBRE BASES DEL MEDIO AMBIENTE; CREA EL MINISTERIO DEL MEDIO AMBIENTE, EL SERVICIO DE EVALUACIÓN

2010, de 10 de marzo. *
DICTAMEN 30 DICTAMEN Nº. 30/2010, de 10 de marzo.* Expediente relativo a revisión de oficio del Decreto de 5 de diciembre de 2007, del Ayuntamiento

2010 En comparación con: Segmentos de usuarios
ento) Solicitud para obtener el servicio de transportes aéreos de mercancías y/o pasajeros para el personal de las Fuerzas Militares (gov.co) 01/07/

Encuesta AIMC a usuarios de Internet 2010
Encuesta AIMC a usuarios de Internet 2010 Patrocina: Colabora: 13º navegantes en Red NAVEGANTES EN LA RED  El contexto: el universo de la poblaci

Memoria Asamblea 2 de Marzo de Memoria deportiva Memoria económica
Memoria 2011 Asamblea 2 de Marzo de ● Memoria deportiva ● Memoria económica Memoria 2.011 Fecha: 2/03/2012 2012 Página 1 Tabla de contenido SALU

MEMORIA PROGRAMA DE PLAYAS 2010
B izkaiko G urutze G orria C ruz R oja B izkaia MEMORIA PROGRAMA DE PLAYAS 2010 1 de Enero del 2010 - 31 de diciembre de 2010 Bizkaiko Gurutze Gorr

Story Transcript

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

Memoria Dinámica

1. PUNTEROS 2. MEMORIA DINÁMICA

2

Memoria Dinámica

1. PUNTEROS

3

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; x

1504 25 int

- La dirección de la variable x (&x) es 1504 - El contenido de la variable x es 25 4

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.

5

Memoria Dinámica 

Declaración de punteros * ;

int

*p;

char *p1; float *p2; 6

Memoria Dinámica 

Operadores de punteros OPERADOR

PROPÓSITO

&

Obtiene la dirección de una variable

*

Define una variable como puntero

*

Obtiene el contenido de una variable puntero

7

Memoria Dinámica 

I nicialización de Punteros 

Estática



Dinámica

8

Memoria Dinámica 

I nicialización Estática 





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;

9

Memoria Dinámica E RROR

SOLUCI ÓN

int *p;

int x = 50;

*p = 50;

int *p;

/*error px no contiene dirección */

p = &x;

10

Memoria Dinámica E RROR float *p; char *c; p = &c;

SOLUCI ÓN

/* c y p tienen que ser del mismo tipo * /

/* no es válido */

11

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

12

Memoria Dinámica TI POS DE PUNTEROS  

Puntero a una función Puntero a una estructura

13

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

14

Memoria Dinámica 

PUNTEROS ESPECIALES PUNTERO NULL  PUNTERO VOID 

15

Memoria Dinámica PUNTERO VOID

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;









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; 16

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

17

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; 18

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

19

Memoria Dinámica Punteros y Arrays 

Un nombre de array es simplemente un puntero. int vector[4] = {20,40,60,80} ; MEMORIA vector

[0]

20

*vector = *(vector+ 0)

[1]

40

*(vector + 1)

[2]

60

*(vector + 2)

[3]

80

*(vector + 3) 20

Memoria Dinámica E RROR

float v[10];

SOLUCI ÓN



float x = 100.5; 

v = &x;

v[ai] = x | ai < 10 Asignar x a una variable puntero.

/* ERROR intento modificar un puntero constante */ 21

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

Memoria Dinámica E RROR

SOLUCI ÓN

char *cadena;

char * cadena = ”Hola”;

..

ó

cadena= ”Hola”;

malloc() + strcpy()

/* ERROR*/

23

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

24

Memoria Dinámica Arrays de punteros 

[0]

[1]

[2]

[3]

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*/ 25

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

26

Memoria Dinámica Punteros de cadenas 

Los punteros se pueden utilizar en lugar de índices de arrays. P G

U

L

\0

[0]

[1]

[2]

[3]

27

Memoria Dinámica E RROR

char cadena[4]=”gul”; char * p; p = &cadena[0]; /* p= cadena */ printf(”%c \n”,*p); p=&cadena;

/* ERROR tipo de asignacion incompatible */ 28

Memoria Dinámica TI POS DE PUNTEROS      

Punteros E speciales (null,void) Punteros a punteros Punteros y arrays Arrays de punteros Punteros a cadenas Punteros como argumentos de funciones

29

Memoria Dinámica Punteros como argumento de funciones 



Paso por valor – no se puede cambiar el valor de la variable. Paso por referencia - Se puede cambiar el valor de la variable.

30

Memoria Dinámica

En C por defecto, el paso de parámetros se hace por valor



31

Memoria Dinámica

C no tiene parámetros por referencia



Solución → PUNTEROS (pasando la dirección de una variable)

32

Memoria Dinámica E jemplo

void funcion ( int * a, int b){

/* invocación a la función*/

*a = 5;

int x =1;

b = 25;

int y = 2;

};

funcion (&x,y);

33

Memoria Dinámica TI POS DE PUNTEROS  

Puntero a una función Puntero a una estructura

34

Memoria Dinámica Punteros a funciones 

Apuntan a código ejecutable, en lugar de direccionar datos.

(*PunteroaFuncion) (); p int func(int); int (*pf)(int); pf=f;

f int func(int n){ ................. ................. } 35

Memoria Dinámica Utilidad 

Pasar una función como argumento a otra función. int fa(int i, int j){ return i+j; );

/* decalaración */ void mifuncion( int (*fa)(int,int) ); /* llamada */ mifuncion(fa);

¡Cuidado! 

La función debe tener el mismo tipo de retorno y lista de parámetros. 36

Memoria Dinámica TI POS DE PUNTEROS  

Puntero a una función Puntero a una estructura

37

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 38

Memoria Dinámica

2. MEMORIA DINÁMICA

39

Memoria Dinámica ¿Punteros o M emoria 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 40

Memoria Dinámica ¿Qué es la M emoria Dinámica? 

Memoria que reservamos durante la ejecución de nuestro programa.

41

Memoria Dinámica ¿Y dónde se almacena esa M EM ORI A? En una zona del mapa de memoria llamada...

ALMACÉN LIBRE

42

Memoria Dinámica M apa de memoria de un programa Memoria alta

El monticulo (almacén libre) Toda la memoria que queda libre está disponible en asignaciones dinámicas de memoria

Cada segmento de código, dato o pila se limita a 64 k

Segmento de Pila La pila crece hacia abajo en memoria Datos no inicializados Datos inicializados

Segmento de datos

Segmento de código #n . .

Memoria baja

Segmento de código #2 Segmento de código #1 43

Memoria Dinámica ¿Y las variables? 

Hay que distinguir..   

Variables globales Variables locales Variables estáticas

44

Memoria Dinámica M apa de memoria de un programa Memoria alta

El monticulo (almacén libre)

.. Segmento de Pila La pila crece hacia abajo en memoria

Variables estáticas

Datos no inicializados

Variables locales (parámetros de funciones..) Variables globales no inicializadas

Datos inicializados Segmento de código #n . .

Memoria baja

Segmento de código #2 Segmento de código #1

Variables globales inicializadas 45

Memoria Dinámica ¿Cómo gestionar esa M E M ORI A?  

Asignar memoria Liberar memoria

46

Memoria Dinámica Funciones de Gestión de M emoria  

ASIGNACIÓN





Función M ALLOC () Función CALLOC () Función RE ALLOC () Función FRE E ()

LIBERACIÓN 47

Memoria Dinámica Funciones de Gestión de M emoria    

Función malloc() Función malloc() Función malloc() Función free()

48

Memoria Dinámica 

Función malloc() 

Asigna bloques de memoria



¿Qué devuelve esta función?

#include void *malloc( size_t size );

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() 49

Memoria Dinámica E jemplo /* Reserva memoria para un entero */

/* Reserva memoria para una array de 5 enteros */

int *p;

int *p;

p = (int *)malloc(sizeof(int));

p = (int *)malloc(sizeof(int) *5 );

(*p)=5;

(*p)=5;

50

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

Memoria Dinámica E RROR int num; scanf (”%d”,&num); int vector[num]; /* ERROR el valor de num es desconocido en tiempo de compilación*/

SOLUCI ÓN int num; int * vector; scanf (”%d”,&num); vector = (int*) malloc(num*sizeof(int);

52

Memoria Dinámica Funciones de Gestión de M emoria    

Función malloc() Función calloc() Función realloc() Función free()

53

Memoria Dinámica 

Función calloc()

#include void *calloc( num_eltos,size_elto );



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. 54

Memoria Dinámica Funciones de Gestión de M emoria    

Función malloc() Función calloc() Función realloc() Función free()

55

Memoria Dinámica 

Función realloc() 

Permite reservar un bloque de memoria reservado anteriormente. #include void *realloc(ptr_a_bloque, tam_total nuevo bloque)



Aconsejable hacer conversión a tipo puntero: Tipo * puntero; Puntero = (tipo *) realloc (ptr_a_bloque, tam_total nuevo bloque ) 56

Memoria Dinámica Funciones de Gestión de M emoria    

Función malloc() Función calloc() Función realloc() Función free()

57

Memoria Dinámica 

Función free() 

Liberar memoria previamente asignada. #include void free( void *ptr );



El bloque de memoria suprimido se devuelve al montículo o almacén libre. 58

Memoria Dinámica

/* 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);

59

Memoria Dinámica RECOM E NDACI ÓN Siempre que se llama a malloc hay que llamar a..



free(p); 60

Memoria Dinámica ¿Y qué es ese famoso SEGM ENTATI ON 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.

61

Memoria Dinámica S egmentation Fault

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

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

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

Memoria Dinámica Dudas y sugerencias, consultar a: Grupo de Usarios de Linux – Carlos III de Madrid (Leganés): 



Lista correo GUL UC3M: [email protected] DESPACHO GUL: 2.3C05 (Ed. Sabatini) (Segundo viernes de cada mes) 65

Memoria Dinámica

FIN 66

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.