Вы находитесь на странице: 1из 64

Algoritmos e estrutura de dados

Aula 2: Estruturas e Alocação dinâmica


Universidade Federal do Triângulo Mineiro

Professor Me. Rooney R. A. Coelho


23 de Agosto de 2017
Roteiro da Apresentação

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica
Estruturas

O que é?
Uma estrutura pode ser vista como um conjunto de variáveis sob o
mesmo nome, e cada uma delas pode ter qualquer tipo (ou o mesmo
tipo). A ideia básica por trás da estrutura é criar apenas um tipo de
dado que contenha vários membros, que nada mais são do que outras
variáveis.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 3 / 51


Estruturas

O que é?
Uma estrutura pode ser vista como um conjunto de variáveis sob o
mesmo nome, e cada uma delas pode ter qualquer tipo (ou o mesmo
tipo). A ideia básica por trás da estrutura é criar apenas um tipo de
dado que contenha vários membros, que nada mais são do que outras
variáveis.

struct nome_struct{
tipo1 campo1;
tipo2 campo2;
...
tipon campoN;
};

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 3 / 51


Estruturas
Importante!
A maioria das estruturas é declarada no escopo global. Por se tratar de
um novo tipo de dado, muitas vezes é interessante que todo o programa
tenha acesso à estrutura.

struct cadastro{
char nome[50];
int idade;
char rua[50];
int numero;
};

Cuidado!
Depois do símbolo de fechar chaves da estrutura, é necessário colocar
um ponto e vírgula!
Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 4 / 51
Escopo local

Importante!
A declaração em escopo local não é muito comum, mas é possível.

struct cadastro{
char nome[50];
int idade;
char rua[50];
int numero;
} cad1, cad2; // Declaração da estrutura e duas
,→ váriáveis desse tipo: cad1 e cad2 são do tipo
,→ cadastro.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 5 / 51


Aplicação
As seguintes variáveis:

char nome1[50], nome2[50], nome3[50], nome4[50];


int idade1, idade2, idade3, idade4;
char rua1[50], rua2[50], rua3[50], rua4[50];
int numero1, numero2, numero3, numero4;

podem ser representadas como pode ser representado como:

struct cadastro c1, c2, c3, c4;

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 6 / 51


Aplicação
As seguintes variáveis:

char nome1[50], nome2[50], nome3[50], nome4[50];


int idade1, idade2, idade3, idade4;
char rua1[50], rua2[50], rua3[50], rua4[50];
int numero1, numero2, numero3, numero4;

podem ser representadas como pode ser representado como:

struct cadastro c1, c2, c3, c4;

Aplicação
O uso de estruturas facilita muito a vida do programador na
manipulação dos dados do programa, reduzindo assim a quantidade de
variáveis definidas.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 6 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 7 / 51


Acessando os campos de uma estrutura
• Cada campo (variável) da estrutura pode ser acessado usando o
operador “.” (ponto).

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 8 / 51


Acessando os campos de uma estrutura
• Cada campo (variável) da estrutura pode ser acessado usando o
operador “.” (ponto).
• Cada variável dentro da estrutura pode ser acessada como se
apenas ela existisse, sem interferência das outras.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 8 / 51


Acessando os campos de uma estrutura
• Cada campo (variável) da estrutura pode ser acessado usando o
operador “.” (ponto).
• Cada variável dentro da estrutura pode ser acessada como se
apenas ela existisse, sem interferência das outras.
• Uma estrutura pode ser vista como um simples agrupamento de
dados.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 8 / 51


Acessando os campos de uma estrutura
• Cada campo (variável) da estrutura pode ser acessado usando o
operador “.” (ponto).
• Cada variável dentro da estrutura pode ser acessada como se
apenas ela existisse, sem interferência das outras.
• Uma estrutura pode ser vista como um simples agrupamento de
dados.

int main(){
struct cadastro c;
// protótipo de gets: char *gets(char *str)
gets(c.nome);
scanf("%d",&c.idade);
gets(c.rua);
scanf("%d",&c.numero);
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 8 / 51


Inicialização

Assim como nos arrays, uma estrutura também pode ser inicializada,
independentemente do tipo das variáveis contidas nela.

struct cadastro c = { "Carlos",18,"Avenida


,→ Brasil",1082};

Importante!
Elementos omitidos durante a inicialização são inicializados com 0. Se
for uma string, será inicializada com uma string vazia.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 9 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 10 / 51


Array de estruturas

Já se mostrou que para a estrutura cadastro pode ser feita da seguinte


maneira

struct cadastro c1, c2, c3, c4;

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 11 / 51


Array de estruturas

Já se mostrou que para a estrutura cadastro pode ser feita da seguinte


maneira

struct cadastro c1, c2, c3, c4;

A representação desses quatro cadastros pode ser ainda mais


simplificada se utilizarmos o conceito de arrays:

struct cadastro c[4];

Desse modo, cria-se um array de estruturas, em que cada posição do


array é uma estrutura do tipo cadastro.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 11 / 51


Array de estruturas
Importante!
Em um array de estruturas, o operador de ponto (.) vem depois dos
colchetes ([ ]) do índice do array.

int main(){
struct cadastro c[4];
int i;
for(i=0; i<4; i++){
gets(c[i].nome);
scanf("%d",&c[i].idade);
gets(c[i].rua);
scanf("%d",&c[i].numero);
}
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 12 / 51


Atribuição entre estruturas
O que é?
A atribuição entre duas variáveis de estrutura faz com que os
conteúdos das variáveis contidas dentro de uma estrutura sejam
copiados para a outra.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 13 / 51


Atribuição entre estruturas
O que é?
A atribuição entre duas variáveis de estrutura faz com que os
conteúdos das variáveis contidas dentro de uma estrutura sejam
copiados para a outra.

Cuidado!
Atribuições entre estruturas só podem ser feitas quando as estruturas
são AS MESMAS, ou seja, quando possuem o mesmo nome!

Por exemplo, a seguinte atribuição não é possível.


struct ponto { struct novo_ponto {
int x; int x;
int y; int y;
}; };

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 13 / 51


Atribuição entre estruturas

int main(){
struct ponto p1, p2= {1,2};
struct novo_ponto p3= {3,4};
p1 = p2;
printf("p1 = %d e %d", p1.x,p1.y);
//ERRO! TIPOS DIFERENTES
p1 = p3;
printf("p1 = %d e %d", p1.x,p1.y);
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 14 / 51


Estrturas aninhadas
O que é?
Podemos declarar uma estrutura que possua uma variável do tipo de
outra estrutura previamente definida. A uma estrutura que contenha
outra estrutura dentro dela damos o nome estruturas aninhadas.

// Endereço struct cadastro{


struct endereco{ char nome[50];
char rua[50]; int idade;
int numero; struct endereco ender;
}; };

Importante!
O acesso aos dados da variável do tipo struct endereco é feito
utilizando-se novamente o operador ponto. O operador ponto é
novamente utilizado para acessar as variáveis dentro dessa estrutura.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 15 / 51


Estrturas aninhadas

int main(){
struct cadastro c;
//Lê do teclado uma string e armazena no campo nome
gets(c.nome);
//Lê do teclado um valor inteiro e armazena no campo
,→ idade
scanf("%d",&c.idade);
//Lê do teclado uma string e armazena no campo rua
,→ da variável ender
gets(c.ender.rua);
//Lê do teclado um valor inteiro e armazena no campo
,→ numero da variável ender
scanf("%d",&c.ender.numero); // <----
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 16 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 17 / 51


O comando typedef
Para que serve?
• O comando typedef NÃO cria um novo tipo. Ele apenas permite
que você defina um sinônimo para um tipo já existente.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 18 / 51


O comando typedef
Para que serve?
• O comando typedef NÃO cria um novo tipo. Ele apenas permite
que você defina um sinônimo para um tipo já existente.
• O comando typedef é comumente pode ser usado para simplificar
a declaração de um tipo definido pelo programador ou de um
ponteiro.

// typedef struct cadastro cad;


typedef struct cadastro{
char nome[50];
int idade;
char rua[50];
int numero;
} cad;

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 18 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 19 / 51


Passagem de estruturas como parâmetros para
funções

Uma estrutura pode ser passada como parâmetro para uma função de
duas formas distintas : toda a estrutura ou apenas determinados
campos.

struct ponto {
int x, y;
};
void imprime(struct ponto p){
printf("x = %d\n",p.x);
printf("y = %d\n",p.y);
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 20 / 51


Passagem de estruturas como parâmetros para
funções

int main(){
struct ponto p1 = {10,20};
imprime(p1);
return 0;
}

void imprime_valor(int n){


printf("Valor = %d\n",n);
}
int main(){
struct ponto p1 = {10,20};
imprime_valor(p1.x);
return 0;
}
Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 21 / 51
Passagem por referência

Passagem por referência de um único campo da estrutura:

void soma_imprime_valor(int *n){


*n = *n + 1;
printf("Valor = %d\n",*n);
}
int main(){
struct ponto p1 = {10,20};
soma_imprime_valor(&p1.x);
soma_imprime_valor(&p1.y);
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 22 / 51


Passagem por referência

Passagem por referência de toda a estrutura:

void atribui(struct ponto *p){


(*p).x = 10; // <---
(*p).y = 20; // <---
}
int main(){
struct ponto p1;
atribui(&p1);
printf("x = %d\n",p1.x);
printf("y = %d\n",p1.y);
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 23 / 51


Passagem por referência

Atenção!
Ao acessar uma estrutura passada por referência, não podemos
esquecer de colocar os parênteses antes de acessar o seu campo. O uso
dos parênteses serve para diferenciar o que foi passado por referência
do que é ponteiro.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 24 / 51


Passagem por referência

Atenção!
Ao acessar uma estrutura passada por referência, não podemos
esquecer de colocar os parênteses antes de acessar o seu campo. O uso
dos parênteses serve para diferenciar o que foi passado por referência
do que é ponteiro.

Atenção!
(*p).x p é a variável passada por referência.

*p.x ou *(p.x) o operador asterisco atuará sobre o campo da


estrutura, não sobre a variável da estrutura.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 24 / 51


Passagem por referência

Importante!
O operador seta, -> , substitui o uso conjunto dos operadores “*” e “.”
no acesso ao campo de uma estrutura passada por referência para uma
função.

void atribui(struct ponto *p){


p->x = 10; // mesmo que (*p).x = 10;
p->y = 20; // mesmo que (*p).y = 20;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 25 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 26 / 51


Alocação dinâmica de memória

O que é?
A linguagem C permite alocar (reservar) dinamicamente (em tempo de
execução) blocos de memórias utilizando ponteiros. A esse processo
dá-se o nome alocação dinâmica.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 27 / 51


Alocação dinâmica de memória

O que é?
A linguagem C permite alocar (reservar) dinamicamente (em tempo de
execução) blocos de memórias utilizando ponteiros. A esse processo
dá-se o nome alocação dinâmica.

Para que serve?


A alocação dinâmica permite ao programador “criar” arrays em tempo
de execução, ou seja, alocar memória para novos arrays quando o
programa está sendo executado.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 27 / 51


Alocação dinâmica de memória

Memória Memória
# var conteúdo # var conteúdo
119 119
120 Alocando 5 120
121 int *n NULL posições de 121 int *n #123
memória em int * n
122 122
123 123 n[0] 11
124 124 n[1] 25
125 125 n[2] 32
126 126 n[3] 44
127 127 n[4] 52
128 128
129 129

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 28 / 51


A função sizeof

O que é?
A função sizeof( ) é usada para saber o número de bytes necessários
para alocar um único elemento de determinado tipo de dado.

int main(){
printf("Tamanho char: %d\n",sizeof(char));
printf("Tamanho int: %d\n",sizeof(int));
printf("Tamanho float: %d\n",sizeof(float));
printf("Tamanho double: %d\n",sizeof(double));
printf("Tamanho struct ponto: %d\n",sizeof(struct
,→ ponto));

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 29 / 51


A função sizeof

int x;
double y;
printf("Tamanho da variavel x: %d\n",sizeof x);
printf("Tamanho da variavel y: %d\n",sizeof y);
return 0;
}

Tamanho char: 1
Tamanho int: 4
Tamanho float: 4
Tamanho double: 8
Tamanho struct ponto: 8
Tamanho da variavel x: 4
Tamanho da variavel y: 8

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 30 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 31 / 51


A função malloc()

Para que serve?


Serve para alocar memória durante a execução do programa. É ela que
faz o pedido de memória ao computador e retorna um ponteiro com
o endereço do início do espaço de memória alocado ou NULL caso
não consiga alocar a memória.

void *malloc( unsigned int num );

Atenção!
Note que a função malloc() retorna um ponteiro genérico (void*). Esse
ponteiro pode ser atribuído a qualquer tipo de ponteiro via type cast.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 32 / 51


A função malloc()

#include <stdio.h>
#include <stdlib.h>
int main(){
int *p;
p = (int *) malloc(5*sizeof(int));
int i;
for (i=0; i<5; i++){
printf("Digite o valor da posicao %d: ",i);
scanf("%d",&p[i]);
}
for (i=0; i<5; i++){
printf("Posição %d: p[%d]: %d\n", p+i ,i, p[i] );
}
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 33 / 51


A função malloc()
Digite o valor da posicao 0: 10
Digite o valor da posicao 1: 20
Digite o valor da posicao 2: 30
Digite o valor da posicao 3: 40
Digite o valor da posicao 4: 50
Posição 32448528: p[0]: 10
Posição 32448532: p[1]: 20
Posição 32448536: p[2]: 30
Posição 32448540: p[3]: 40
Posição 32448544: p[4]: 50

Importante!
Note que o ponteiro criado por malloc pode ser acessado com a
notação de array p[i] ou por aritmética de ponteiros *(p+i).
Note também que o conteúdo alocado está armazenado de forma
sequencial na memória.
Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 34 / 51
A função malloc()

Boa prática
É importante sempre testar se foi possível fazer a alocação de memória.
A função malloc() retorna um ponteiro NULL para indicar que não
há memória disponível no computador ou que ocorreu algum outro
erro que impediu a memória de ser alocada.

Cuidado!
Lembre-se: no momento da alocação da memória, deve-se levar em
conta o tamanho do dado alocado. Alocar 1.000 bytes de memória
equivale a um número de elementos diferente, dependendo do tipo do
elemento: 1000 Bytes para char aloca um array de 1000 posições de
caracteres; 1000 Bytes para int aloca 250 posições de inteiros.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 35 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 36 / 51


A função calloc()
Para que serve?
Assim como a função malloc(), a função calloc() também serve para
alocar memória durante a execução do programa. É ela que faz o
pedido de memória ao computador e retorna um ponteiro com o
endereço do início do espaço de memória alocado.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 37 / 51


A função calloc()
Para que serve?
Assim como a função malloc(), a função calloc() também serve para
alocar memória durante a execução do programa. É ela que faz o
pedido de memória ao computador e retorna um ponteiro com o
endereço do início do espaço de memória alocado.

void *calloc (unsigned int num, unsigned int size);

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 37 / 51


A função calloc()
Para que serve?
Assim como a função malloc(), a função calloc() também serve para
alocar memória durante a execução do programa. É ela que faz o
pedido de memória ao computador e retorna um ponteiro com o
endereço do início do espaço de memória alocado.

void *calloc (unsigned int num, unsigned int size);

Qual a diferença do malloc?


Basicamente, a função calloc() faz o mesmo que a função malloc(). A
diferença é que agora passamos os valores da quantidade de elementos
alocados e do tipo de dado alocado como parâmetros distintos da
função.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 37 / 51


#include <stdio.h>
#include <stdlib.h>
int main(){
//alocação com malloc
int *p;
p = (int *) malloc( 50*sizeof(int) );
if ( p == NULL ){
printf("Erro: Memoria Insuficiente!\n");
}
//alocação com calloc
int *p1;
p1 = (int *) calloc( 50, sizeof(int) );
if(p1 == NULL){
printf("Erro: Memoria Insuficiente!\n");
}
return 0;
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 38 / 51


A função calloc()

Importante
Existe outra diferença entre a função calloc() e a função malloc():
ambas servem para alocar memória, mas a função calloc() inicializa
todos os BITS do espaço alocado com 0s.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 39 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 40 / 51


A função realloc()

Para que serve?


A função realloc() serve para alocar memória ou realocar blocos de
memória previamente alocados pelas funções malloc(), calloc() ou
realloc().

void *realloc (void *ptr, unsigned int num);

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 41 / 51


A função realloc()

Para que serve?


A função realloc() serve para alocar memória ou realocar blocos de
memória previamente alocados pelas funções malloc(), calloc() ou
realloc().

void *realloc (void *ptr, unsigned int num);

A função realloc() modifica o tamanho da memória previamente


alocada e apontada pelo ponteiro ptr para um novo valor especificado
por num, sendo num o tamanho em bytes do bloco de memória
solicitado. O novo valor de memória alocada (num) pode ser maior ou
menor do que o tamanho previamente alocado.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 41 / 51


#include <stdio.h>
#include <stdlib.h>
int main(){
int i;
int *p = malloc(5*sizeof(int));
for (i = 0; i < 5; i++){
p[i] = i+1;
}
for (i = 0; i < 5; i++){
printf("%d\n",p[i]);
}

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 42 / 51


A função realloc()

//Aumenta o tamanho do array


p = realloc(p,10*sizeof(int));
for (i = 0; i < 10; i++){
printf("%d\n",p[i]);
}
return 0;
}

Atenção
Os valores impressos no primeiro loop são: 1 2 3 4 5. Já após o
primeiro realloc, que diminui o tamanho do vetor, têm-se: 1 2 3, note
que manteve-se o início do array.
Ao aumentar o tamanho da memória alocada com o próximo realloc,
têm-se 1 2 3 ? ? ? ? ? ? ?

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 43 / 51


A função realloc()

int *p;
p = (int *) realloc(NULL,5*sizeof(int));

Atenção!
Isso não significa dizer que o novo bloco de memória será alocado no
começo da memória. Nesse caso a função realloc funcionará tal e
qual a malloc. Já para o caso onde o tamanho da memória solicitada
for zero, p = (int *) realloc(p,0), realloc funcionará
tal e qual a função free, liberando a memória alocada.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 44 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 45 / 51


A função free()
Para que serve
Diferentemente das variáveis declaradas durante o desenvolvimento do
programa, as variáveis alocadas dinamicamente não são liberadas
automaticamente por ele. Sempre que alocamos memória de forma
dinâmica é necessário liberar essa memória quando ela não for mais
necessária. Para liberar um bloco de memória previamente alocado
utilizamos a função free().

void free (void *p);

Importante!
Desalocar, ou liberar, a memória previamente alocada faz com que ela
se torne novamente disponível para futuras alocações.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 46 / 51


#include <stdio.h>
#include <stdlib.h>
int main(){
int *p,i;
//aloca memória para p
p = (int *) malloc(50*sizeof(int));
for (i = 0; i < 50; i++){
p[i] = i+1;
}
//libera a memória alocada
free(p);
return 0;
}

Boa prática
Atribuir NULL a esses ponteiros após a liberação da memória.

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 47 / 51


Próximo Tópico

1 Estruturas: o comando struct


Acessando os campos de uma estrutura
Array de estruturas
O comando typedef
Passagem para funções

2 Alocação dinâmica de memória

A função malloc()
A função calloc()
A função realloc()
A função free()
Comparativo entre alocação estática e dinâmica

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 48 / 51


Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 49 / 51
Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 50 / 51
Obrigado!

Professor Me. Rooney R. A. Coelho (UFTM) Aula 2 23 de Agosto de 2017 51 / 51

Вам также может понравиться