Você está na página 1de 29

Vetores e Alocação Dinâmica

Prof. Mauricio Rêgo Mota da Rocha


Agenda
 Introdução
 Vetores
 Passagem de Vetores para Funções.
 Alocação Dinâmica
 Uso da Memória.
 Funções da Biblioteca Padrão “stdlib.h”.
 Vetores Locais a Funções

Estrutura de Dados - Prof. Mauricio Rocha


Introdução
 Nesta aula, discutiremos a forma mais primitiva de
armazenar um conjunto de dados na memória do
computador.
 Para motivar a discussão, vamos considerar
inicialmente um exemplo simples de um programa
para calcular a média aritmética de n valores reais
fornecidos pelo usuário via teclado.
 Como sabemos, a média aritmética de um conjunto
de valores é dada por:

Estrutura de Dados - Prof. Mauricio Rocha


Introdução
 Como vemos, esse exemplo é simples e pode ser
construído sem precisar armazenar o conjunto de
valores.
 O cálculo da soma dos valores pode ser feito enquanto
os valores são capturados.
 Em muitas aplicações, entretanto, necessitamos
armazenar o conjunto de valores na memória do
computador para depois efetuar computações com
esses valores.
 Um exemplo é os valores da média e variância que
são dados pelas fórmulas:

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 A forma mais simples de estruturar um conjunto de
dados é por meio de vetores.
 Como a maioria das linguagens de programação, C
permite a definição de vetores. Definimos um vetor
em C da seguinte forma:

 Essa declaração diz que v é um vetor de inteiros


dimensionado com 10 elementos.
 Reservamos um espaço de memória contínuo para
armazenar 10 valores inteiros.
 Se cada int ocupa 4 bytes, a declaração reserva um
espaço de memória de 40 bytes.
Estrutura de Dados - Prof. Mauricio Rocha
Vetores
 Vetores e Ponteiros:
 Nome do vetor aponta para endereço inicial.
 C permite aritmética de ponteiros.
 Exemplo:
 v+0: primeiro elemento de v
 ...
 v+9: último elemento de v
 Exemplo:
 &v[i] é equivalente a (v+i)
 *(v+i) é equivalente v[i]

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Exemplo:
 Cálculo da média e da variância de um conjunto de 10
números reais.

 Implementação:
 Valores são lidos e armazenados em um vetor de 10 posições.
 Cálculos da média e da variância efetuados sobre o conjunto
de valores armazenados.

Estrutura de Dados - Prof. Mauricio Rocha


Vetores

Estrutura de Dados - Prof. Mauricio Rocha


Vetores

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Passagem de Vetores para Funções
 Consistem em passar o endereço da primeira posição do
vetor.
 Função deve ter parâmetro do tipo ponteiro para
armazenar valor.
 “Passar um vetor para a função” é equivalente a “passar o
endereço inicial do vetor”.
 Elementos do vetor não são copiados para função.
 Argumento copiado é apenas o endereço do primeiro elemento.
 Exemplo:
 Chamada a função passando vetor de int.
 Função deve ter um parâmetro do tipo int.

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Passagem de Vetores para Funções

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Passagem de Vetores para Funções

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Passagem de Vetores para Funções

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Passagem de Vetores para Funções
 Função pode alterar os valores dos elementos do vetor,
pois recebe o endereço do primeiro elemento do vetor (e
não os elementos propriamente ditos)
 Exemplo:
 Função incrementando todos os elementos em uma unidade.

Estrutura de Dados - Prof. Mauricio Rocha


Vetores
 Passagem de Vetores para Funções

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Até aqui, na declaração de um vetor, foi preciso
dimensioná-lo, o que nos obrigava a saber, quanto
espaço seria necessário.
 Esse pré-dimensionamento é um fator limitante.
 Uma solução é dimensionar o vetor com um número
absurdamente alto.
 Isso levaria a um desperdício de memória, o que é inaceitável
em diversas aplicações.
 A linguagem C oferece meios de requisitar espaços
de memória em tempo real.
 Dizemos que podemos alocar memória dinamicamente.

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Uso da Memória
 Informalmente, podemos dizer que existem três maneiras
de reservar espaço de memória para o armazenamento
de informações:
 Uso de Variáveis Globais (e Estáticas)
 O espaço reservado para uma variável global existe enquanto o
programa estiver sendo executado.
 Uso de Variáveis Locais
 O espaço existe apenas enquanto a função que declarou a variável
está sendo executada.
 Liberando para outros usos quando a execução da função termina.
 Alocação Dinâmica
 Espaço de memória é requisitada em tempo de execução.
 Espaço permanece reservado até que seja explicitamente liberado, ou
liberado automaticamente ao final da execução.

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Uso da Memória

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Funções da Biblioteca Padrão “stdlib.h”
 Permitem alocar e liberar memória dinamicamente.
 Função malloc
 Função básica para alocar memória.
 Recebe como parâmetro o número de bytes que se deseja
alocar e retorna o endereço inicial da área de memória alocada.
 Retorna um ponteiro genérico, para um tipo qualquer.
 Retorna um endereço nulo, se não houver espaço livre,
representado pelo símbolo NULL.
 Função sizeof
 Retorna o número de bytes ocupado por um tipo.

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Exemplo
 Alocação dinâmica de um vetor de inteiros com 10
elementos:
 A função malloc retorna o endereço da área alocada para
armazenar valores inteiros.
 Ponteiro de inteiro recebe endereço inicial do espaço alocado.

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Exemplo

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Exemplo
 Tratamento de erro após a chamada a malloc
 Imprime mensagem de erro.
 Aborta o programa (com a função exit).

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Função free
 Recebe como parâmetro o ponteiro da memória a ser
liberada.
 A função free deve receber um endereço de memória que tenha
sido alocado dinamicamente.

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Exemplo

Estrutura de Dados - Prof. Mauricio Rocha


Alocação Dinâmica
 Exemplo

Estrutura de Dados - Prof. Mauricio Rocha


Vetores Locais a Funções
 Área de Memória de uma Variável Local:
 Só existe enquanto a função que declara a variável
estiver sendo executada.
 Requer cuidado quando da utilização de vetores locais
dentro de funções.
 Exemplo:
 Produto vetorial de dois vetores u e v em 3D,
representados pela três componentes x, y e z.

Estrutura de Dados - Prof. Mauricio Rocha


Vetores Locais a Funções
 Variável p declarada localmente:
 Área de memória que a variável p ocupa deixa de ser
válida quando a função prod_vetorial termina.
 Função que chama prod_vetorial não pode acessar a
área apontada pelo valor retornado.

Estrutura de Dados - Prof. Mauricio Rocha


Vetores Locais a Funções
 Variável p alocada dinamicamente:
 Área de memória que a variável p ocupa permanece
válida mesmo após o término da função prod_vetorial.
 Função que chama prod_vetorial pode acessar o ponteiro
retornado.
 Ineficiente do ponto de vista computacional.
 Requer que a função que chama seja responsável pela
liberação de espaço.

Estrutura de Dados - Prof. Mauricio Rocha


Vetores Locais a Funções
 Espaço de memória para armazenamento do
resultado passado pela função que chama:
 Função prod_vetorial recebe três vetores
 Dois com dados de entrada.
 Um vetor para armazenar o resultado.
 Solução mais adequada pois não envolve alocação
dinâmica.

Estrutura de Dados - Prof. Mauricio Rocha

Você também pode gostar