Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
#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