Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo,...

Post on 12-Oct-2020

2 views 0 download

Transcript of Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo,...

#include <stdio.h>main(){ int V[3000], N; do{ printf (“N = ?”); scanf (“%d”, &N); }while ((N < 0) || (N > 3000); for (i = 0; i < N, i++) { printf (“Insira um inteiro: “); scanf (“%d”, &V[i]); }}

Memória estática

Memória estática

#include <stdio.h>main(){ int V[3000], N; do{ printf (“N = ?”); scanf (“%d”, &N); }while ((N < 0) || (N > 3000); for (i = 0; i < N, i++) { printf (“Insira um inteiro: “); scanf (“%d”, &V[i]); }}

Memória estática

Memória estática

void *calloc (size_t nmemb, size_t size);

➔ reserva um bloco de memória contígua com espaço suficiente para

armazenar nmemb elementos de dimensão size cada;

➔ devolve o endereço (apontador) para a primeira posição do bloco

ou NULL quando não for possível alocar memória;

➔ size_t é o tipo utilizado para especificar as dimensões numéricas

em várias funções do C;

➔ O tipo de retorno void * corresponde a um endereço genérico de

memória (permite a utilização por todo o tipo de ponteiro);

➔ todas as posições do bloco de memória são inicializadas com zero.

Memória dinâmica

Por exemplo,

float *p;

p = (float *) calloc (2000, sizeof (float));

➔ reserva de memória para um bloco de 2000 reais;

➔ a partir daqui, p pode ser tratado como um vector de 2000

posições (para 2000 valores reais);

➔ p é um ponteiro para o primeiro elemento do vector;

➔ sizeof() é um operador do C que devolve a dimensão (em geral,

em bytes) do tipo ou variável indicado no argumento;

➔ (float *) funciona como um operador de cast (obriga a devolver

um ponteiro para um real).

Memória dinâmica

Memória dinâmica

void *malloc (size_t total_size);

➔ reserva um bloco de memória contígua de dimensão total_size

expressa em bytes;

➔ devolve o endereço (ponteiro) para a primeira posição do bloco ou

NULL quando não for possível alocar memória;

➔ size_t é o tipo utilizado para especificar as dimensões numéricas

em várias funções do C;

➔ O tipo de retorno void * corresponde a um endereço genérico de

memória (permite a utilização por todo o tipo de ponteiro);

➔ calloc(n,d) pode ser simplesmente substituído por malloc(n*d);

➔ as posições do bloco não são inicializadas com qualquer valor.

Memória dinâmica

void *realloc (void *ptr, size_t total_new_size);

➔ ptr é o ponteiro para o bloco de memória reservado antes;

➔ total_new_size é a dimensão total que se pretende agora para o

mesmo bloco;

➔ retorna um apontador para o bloco de memória redimensionado;

➔ o segundo argumento (size_t total_new_size) tem um significado

semelhante ao da função malloc (size_t total_size).

Memória dinâmica

void *free (void *ptr);

➔ ptr é o ponteiro para o bloco de memória reservado antes, o qual

foi devolvido por malloc, calloc ou realloc.

Memória dinâmica

int *p, N;

do{

printf (“Insira a dimensão do vector: “);

scanf (“%d”, &N);

} while (N < 0); // por exemplo, N = 2000

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

Memória dinâmica

int *p, N;

Memória dinâmica

int *p, N;

do{

printf (“Insira a dimensão do vector: “);

scanf (“%d”, &N);

} while (N < 0); // por exemplo, N = 2000

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

Memória dinâmica

Memória dinâmica

int *p, N;

do{

printf(“Insira a dimensão do vector: “);

scanf(“%d”, &N);

} while (N < 0);

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

for (i = 0; i < N; i++)

{

printf(“Inserir um valor inteiro: “);

scanf(“%d”, &p[i]);

}

Memória dinâmica

Memória dinâmica

int *p, N;

do{

printf (“Insira a dimensão do vector: “);

scanf (“%d”, &N);

} while (N < 0);

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

for (i = 0; i < N; i++)

{

printf (“Inserir um valor inteiro: “);

scanf (“%d”, &p[i]);

}

p = (int *) realloc (p, (N+1000) * sizeof (int));

Memória dinâmica

Memória dinâmica

Memória dinâmica

Memória dinâmica

int *p, N;

do{

printf (“Insira a dimensão do vector: “);

scanf (“%d”, &N);

} while (N < 0);

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

for (i = 0; i < N; i++)

{

printf (“Inserir um valor inteiro: “);

scanf (“%d”, &p[i]);

}

p = (int *) realloc (p, (N+1000) * sizeof (int));

free (p);

Memória dinâmica

Memória dinâmica

Memória dinâmica vs. estática

#include <stdio.h>main (){ int V[3000], N; do{ printf (“N = ?”); scanf (“%d”, &N); } while ((N < 0) || (N > 3000); for (i = 0; i < N, i++) { printf (“Insira um inteiro: “); scanf (“%d”, &V[i]); }}

#include <stdio.h>#include <stdlib.h>main (){ int *V, N; do{ printf (“N = ?”); scanf (“%d”, &N); }while (N < 0); V = (int*) malloc (N*sizeof (int)); if (V == NULL) exit(1); for (i = 0; i < N, i++) { printf (“Insira um inteiro: “); scanf (“%d”, &V[i]); } free (V);}

Memória estática

Memória dinâmica