25
#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áticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

#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

Page 2: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória estática

Page 3: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

#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

Page 4: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória estática

Page 5: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 6: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 7: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 8: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 9: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 10: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 11: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 12: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

int *p, N;

Memória dinâmica

Page 13: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 14: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 15: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 16: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 17: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 18: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 19: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 20: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 21: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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

Page 22: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica

Page 23: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

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);}

Page 24: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória estática

Page 25: Memória estáticaninf.org/w/images/9/95/Programação_II_2015_Aula_Teórica_3.pdf · Por exemplo, float *p; p = (float *) calloc (2000, sizeof (float)); reserva de memória para

Memória dinâmica