Aula 6 - Alocação Dinâmica de Memória

download Aula 6 - Alocação Dinâmica de Memória

of 28

  • date post

    16-Nov-2015
  • Category

    Documents

  • view

    222
  • download

    5

Embed Size (px)

description

Alocação Dinâmica

Transcript of Aula 6 - Alocação Dinâmica de Memória

  • 1

  • Alocao Dinmica de Memria

    Prof. Mauricio Scoton

    2

  • Alocao Dinmica

    At o momento, na declarao de um vetor paraListas, Pilhas e Filas, tnhamos que saber de antemoo quanto de espao seria necessrio.

    Esse pr-dimensionamento era um fator limitante.

    Por exemplo, se desenvolvermos um programa paracalcular a mdia e a varincia das notas de umaprova, teremos de prever o nmero mximo dealunos.

    (PLT pginas 250 a 256).

  • Alocao Dinmica

    Solues?

    Dimensionar o vetor com um nmero absurdamente alto,para no termos limitaes no momento da utilizao doprograma.

    Sermos modestos no pr-dimensionamento do vetor.

  • Alocao Dinmica

    Desvantagens?

    Desperdcio de memria, o que inaceitvel em diversasaplicaes.

    Programa fica muito limitado, pois no conseguiramostratar turmas com um nmero de alunos maior que oprevisto.

  • Alocao Dinmica

    A linguagem C oferece meios de requisitar espaosde memria em tempo de execuo.

    Dizemos que podemos alocar memriadinamicamente.

  • Alocao Dinmica

    Uso da memria

    Podemos dizer que existem trs maneiras de reservar espao de memria para o armazenamento de informaes:

    Usar variveis globais

    Usar variveis locais

    Alocar memria dinamicamente.

  • Alocao Dinmica

    A primeira usar variveis globais (e estticas). Oespao reservado para uma varivel global existequanto o programa estiver sendo executado.

    A segunda maneira usar variveis locais. Nessecaso, o espao existe apenas enquanto a funo quedeclarou a varivel est sendo executada, sendoliberado para outros usos quando a execuo dafuno termina.

  • Alocao Dinmica

    A terceira maneira de reservar memria requisitarao sistema, em tempo de execuo, um espao deum terminado tamanho. Esse espao alocadodinamicamente permanece reservado at que sejaexplicitamente liberado pelo programa.

    A partir do momento em que liberarmos o espao,ele estar disponibilizado para outros usos e nopodemos mais acess-lo.

  • Alocao Dinmica

    Se o programa no liberar um espao alocado, eleser automaticamente liberado quando a execuodo programa terminar.

    Na figura 1, apresentamos um esquema didtico queilustra de maneira fictcia a distribuio do uso damemria pelo sistema operacional.

  • Alocao Dinmica

    O sistema operacional reservaespaos necessrios paraarmazenar as variveis globais(e estticas) existentes noprograma e o restante damemria livre utilizado pelasvariveis locais e pelasvariveis alocadasdinamicamente.

    Cdigo do

    Programa

    Variveis Globais

    e Estticas

    Memria Alocada

    Dinamicamente

    Memria Livre

    Pilha

  • Alocao Dinmica

    Cada vez que uma determinada funo chamada, osistema reserva o espao necessrio para as variveislocais da funo.

    Esse espao pertence pilha de execuo e, quandoa funo termina, desempilhado.

    A parte da memria no ocupada pela pilha deexecuo pode ser requisitada dinamicamente.

  • Alocao Dinmica

    Funes da biblioteca padro

    Existem funes, presentes na biblioteca padrostdlib, que permitem alocar e liberar memriadinamicamente.

    A funo bsica para alocar memria malloc.

    Ela recebe como parmetro o nmero de bytes quese deseja alocar e retorna o endereo inicial da reada memria alocada.

  • Alocao Dinmica

    Para exemplificar, vamos considerar a alocaodinmica de um vetor de inteiros com 10 elementos.

    Como a funo malloc tem como valor de retorno oendereo da rea alocada e, nesse exemplo,desejamos armazenar valores inteiros nessa rea,devemos declarar um ponteiro de inteiro parareceber o endereo inicial do espao alocado.

  • Alocao Dinmica

    O trecho de cdigo ento seria:

    int *v;

    v = malloc(10*4);

    Aps esse comando, se a alocao for bem sucedida,v armazenar o endereo inicial de uma reacontnua de memria suficiente para armazenar 10valores inteiros.

  • Alocao Dinmica

    Podemos, ento, tratar v como tratamos um vetordeclarado estaticamente, pois, se v aponta para oincio da rea alocada, sabemos que v[0] acessa oespao o primeiro elemento a ser armazenado, v[1]acessa o segundo, e assim por diante (at v[9]).

  • Alocao Dinmica

    No exemplo mostrado, consideremos que um inteiroocupa 4 bytes. Para ficarmos independentes decompiladores e mquinas, usamos o operadorsizeof()

    v = malloc(10*sizeof(int));

    Alm disso, devemos salientar que a funo malloc usada para alocar espao para armazenar valores dequalquer tipo.

  • Alocao Dinmica

    Por esse motivo, malloc retorna um ponteirogenrico, para um tipo qualquer, representado porvoid*, que pode ser convertido automaticamentepela linguagem para o tipo apropriado na atribuio.

    No entanto, comum fazer a converso utilizando ooperador de molde de tipo (cast).

  • Alocao Dinmica

    O comando para a alocao do vetor de inteiros fica ento:

    v = (int*) malloc (10*sizeof(int));

    Assim, o ponteiro v aponta para o endereo inicial de umarea contnua de memria para 10 inteiros.

    O operador sizeof() obtm o tamanho em bytes do tipo int eo operador de cast (int*), converte o ponteiro genricoretornado por malloc para um ponteiro do tipo int*.

  • Alocao Dinmica

    2 Comando: v = (int*)malloc(10*sizeof(int))

    Reserva espao de memria da rea

    livre e atribui endereo varivel

    Cdigo do Programa

    Variveis Globais e

    Estticas

    1 Declarao: int *vAbre-se Espao na pilha para o

    ponteiro (varivel local)

    Cdigo do Programa

    Variveis Globais e

    Estticas

    Livre

    v v 504

    Livre

    40 bytes

  • Alocao Dinmica

    Se, porventura, no houver espao livre suficientepara realizar a alocao, a funo retorna umendereo nulo (representado pelo smbolo NULL,definido em stdlib.h).

    Podemos cercar o erro na alocao da memriaverificando o valor de retorno da funo malloc.

  • Alocao Dinmica

    ...

    v = (int*) malloc (10*sizeof(int));

    if (v == NULL)

    {

    printf(Memoria insuficiente.\n);

    exit(1);

    }

    ...

  • Alocao Dinmica

    Para liberar um espao de memria alocadodinamicamente, usamos a funo free.

    Essa funo recebe como parmetro o ponteiro damemria a ser liberada.

    Assim, para liberar o vetor v, fazemos:free (v);

    S podemos passar para a funo free um endereode memria que tenha sido alocadodinamicamente.

  • Alocao Dinmica - Exemplo

    main(){

    int i, n;float *v;float med;printf("Quantas notas sero lidas?: ");scanf("%i",&n);/*alocao dinmica*/v = (float*) malloc (n*sizeof(float));if(v == NULL) {

    printf("Memria Insuficiente");return 1;

    }

    /*leitura dos valores*/for(i=0; i

  • Alocao Dinmica - Exemplo

    /* funo para clculo da mdia */

    float media(int n, float *v)

    {

    int i;

    float s = 0.0f;

    for(i=0; i

  • Alocao Dinmica - Outro Exemplo

    main(){1 int *p, *q;2 int x;3 p = (int*) malloc(sizeof(int));4 *p = 3;5 q = p;6 printf("%d %d\n", *p, *q);7 x = 7;8 *q = x;9 printf("%d %d\n", *p, *q);10 p = (int*) malloc(sizeof(int));11 *p = 5;12 printf("%d %d\n", *p, *q);}

    Na linha 3, uma varivel inteira criada e seu endereo colocado emp.

    A linha 4 define o valor dessa varivel

    como 3.

    A linha 5 define q com o valor dessavarivel. (ver Figura a)

    A linha 6, portanto, imprime ocontedo dessa varivel (que 3)duas vezes.

    A linha 7 define o valor de umavarivel de inteiro, x, com 7

  • Alocao Dinmica - Outro Exemplo

    A linha 8 muda o valor de *q para ovalor de x. Entretanto, como p e qapontam ambos para a mesmavarivel, *p e *q tm o valor 7. (verFigura b)

    A linha 9, portanto, imprime onmero 7 duas vezes.

    A linha 10 cria uma nova varivelinteira e coloca seu endereo em p.(ver Figura c)

    A linha 11 define o valor dessavarivel recm-criada com 5 (verFigura d)

    A linha 12 imprime os valores 5 e 7.

    main(){1 int *p, *q;2 int x;3 p = (int*) malloc(sizeof(int));4 *p = 3;5 q = p;6 printf("%d %d\n", *p, *q);7 x = 7;8 *q = x;9 printf("%d %d\n", *p, *q);10 p = (int*) malloc(sizeof(int));11 *p = 5;12 printf("%d %d\n", *p, *q);}

  • Alocao Dinmica - Outro Exemplo

    p

    q 3

    a)

    p

    q 7

    x

    7

    b)

    p

    q x

    7 7

    c)

    p

    q x

    7 7

    d)

    5