SlideShare uma empresa Scribd logo
1 de 19
1
Revisão
Alocação Dinâmica de
Memória
1
2
Tópicos
● Alocação dinâmica de memória
● Vetores locais e funções
3
Alocação dinâmica
● Uso da memória:
– uso de variáveis globais (e estáticas):
» espaço reservado para uma variável global existe
enquanto o programa estiver sendo executado
– uso de variáveis locais:
» espaço existe apenas enquanto a função que declarou a
variável está sendo executada
» liberado para outros usos quando a execução da função
termina
– variáveis globais ou locais podem ser simples ou vetores:
» para vetor, é necessário informar o número máximo de
elementos pois o compilador precisa calcular o espaço a ser
reservado
4
Alocação dinâmica
● Uso da memória:
– alocação dinâmica:
» espaço de memória é requisitado em tempo de execução
» espaço permanece reservado até que seja explicitamente
liberado
• depois de liberado, espaço estará disponibilizado para outros usos e
não pode mais ser acessado
• espaço alocado e não liberado explicitamente,
será automaticamente liberado ao final da execução
5
Alocação dinâmica
 Uso da memória:
– memória estática:
» código do programa
» variáveis globais
» variáveis estáticas
– memória dinâmica:
» variáveis alocadas
dinamicamente
» memória livre
» variáveis locais
Código do programa
Variáveis globais e
Variáveis estáticas
Variáveis alocadas
dinamicamente
Memória livre
Variáveis locais
(Pilha de execução)
memória
estática
memória
dinâmica
6
Alocação dinâmica
Uso da memória:
alocação dinâmica de memória:
usa a memória livre
se o espaço de memória livre for
menor que o espaço requisitado,
a alocação não é feita e
o programa pode prever
tratamento de erro
pilha de execução:
utilizada para alocar memória quando
ocorre chamada de função:
sistema reserva o espaço
para as variáveis locais da
função
quando a função termina,
espaço é liberado
(desempilhado)
se a pilha tentar crescer mais do que
o espaço disponível existente,
programa é abortado com erro
Código do programa
Variáveis globais e
Variáveis estáticas
Variáveis alocadas
dinamicamente
Memória livre
Variáveis locais
(Pilha de execução)
memória
estática
memória
dinâmica
7
Alocação dinâmica
● Funções da biblioteca padrão "stdlib.h"
– contém uma série de funções pré-definidas:
» funções para tratar alocação dinâmica de memória
» constantes pré-definidas
» ....
8
Alocação dinâmica
void * malloc(int num_bytes);
void free(void * p);
9
Alocação dinâmica
● Função "malloc":
– recebe como parâmetro o número de bytes que se deseja alocar
– retorna um ponteiro genérico para o endereço inicial da área de memória alocada,
se houver espaço livre:
» ponteiro genérico é representado por void*
» ponteiro é convertido automaticamente para o tipo apropriado
» ponteiro pode ser convertido explicitamente
– retorna um endereço nulo, se não houver espaço livre:
» representado pelo símbolo NULL
● Operador "sizeof":
– retorna o número de bytes ocupado por um tipo
● 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
10
Alocação dinâmica
● Exemplo:
– alocação dinâmica de um vetor de inteiros com 10 elementos
» malloc retorna o endereço da área alocada para
armazenar valores inteiros
» ponteiro de inteiro recebe endereço inicial do espaço
alocado
int *v;
v = (int *) malloc(10*sizeof(int));
11
Alocação dinâmica
● Exemplo (cont.):
v = (int *) malloc(10*sizeof(int));
1 - Declaração: int *v
v
Abre-se espaço na pilha para
o ponteiro (variável local)
2 - Comando: v = (int *) malloc (10*sizeof(int))
Reserva espaço de memória da área livre
e atribui endereço à variável
v
504
Código do
Programa
Variáveis
Globais e Estáticas
-
Livre
Código do
Programa
Variáveis
Globais e Estáticas
504
Livre
40 bytes
1 - Declaração: int *v
v
Abre-se espaço na pilha para
o ponteiro (variável local)
2 - Comando: v = (int *) malloc (10*sizeof(int))
Reserva espaço de memória da área livre
e atribui endereço à variável
v
504
Código do
Programa
Variáveis
Globais e Estáticas
-
Livre
Código do
Programa
Variáveis
Globais e Estáticas
-
Livre
Código do
Programa
Variáveis
Globais e Estáticas
504
Livre
40 bytes
12
Alocação dinâmica
● Exemplo (cont.):
– v armazena endereço inicial de uma área contínua de memória suficiente
para armazenar 10 valores inteiros
– v pode ser tratado como um vetor declarado estaticamente
» v aponta para o inicio da área alocada
» v[0] acessa o espaço para o primeiro elemento
» v[1] acessa o segundo
» .... até v[9]
13
Alocação dinâmica
Exemplo (cont.):
– tratamento de erro após chamada a malloc
» imprime mensagem de erro
» aborta o programa (com a função exit)
…
v = (int*) malloc(10*sizeof(int));
if (v==NULL)
{
printf("Memoria insuficiente.n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}
…
free(v);
14
Alocação dinâmica
#include <stdlib.h>
int main ( void ) {
float *v;
float med, var;
int i,n;
printf("Entre n e depois os valoresn");
scanf("%d",&n);
v = (float *) malloc(n*sizeof(float));
if (v==NULL) { printf("Falta memorian"); exit(1); }
for ( i = 0; i < n; i++ )
scanf("%f", &v[i]);
med = media(n,v);
var = variancia(n,v,med);
printf ( "Media = %f Variancia = %f n", med, var);
free(v);
return 0;
}
15
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 pelas três componentes x, y, e z
 
y
x
y
x
x
z
x
z
z
y
z
y
u
v
v
u
u
v
v
u
u
v
v
u 



 ,
,
v
u
16
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
float* prod_vetorial (float* u, float* v)
{
float p[3];
p[0] = u[1]*v[2] – v[1]*u[2];
p[1] = u[2]*v[0] – v[2]*u[0];
p[2] = u[0]*v[1] – v[0]*u[1];
return p;
}
17
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
» problema - alocação dinâmica para cada chamada da função:
• ineficiente do ponto de vista computacional
• requer que a função que chama seja responsável pela liberação do
espaço
float* prod_vetorial (float* u, float* v) {
float *p = (float*) malloc(3*sizeof(float));
p[0] = u[1]*v[2] – v[1]*u[2];
p[1] = u[2]*v[0] – v[2]*u[0];
p[2] = u[0]*v[1] – v[0]*u[1];
return p;
}
18
Vetores locais a funções
– espaço de memória para o resultado
passado pela função que chama:
» função prod_vetorial recebe três vetores,
• dois vetores com dados de entrada
• um vetor para armazenar o resultado
» solução mais adequada pois não envolve alocação dinâmica
void prod_vetorial (float* u, float* v, float* p){
p[0] = u[1]*v[2] – v[1]*u[2];
p[1] = u[2]*v[0] – v[2]*u[0];
p[2] = u[0]*v[1] – v[0]*u[1];
}
19
Resumo
Funções para gerência de memória:
sizeof retorna o número de bytes ocupado por um tipo
malloc recebe o número de bytes que se deseja alocar
retorna um ponteiro para o endereço inicial, ou
retorna um endereço nulo (NULL)
free recebe o ponteiro da memória a ser liberada

Mais conteúdo relacionado

Semelhante a RevisãoAlocaçãodeMemória.pptx

Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
Leonardo Lima
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
Jocelma Rios
 
Estrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memóriaEstrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memória
Adriano Teixeira de Souza
 

Semelhante a RevisãoAlocaçãodeMemória.pptx (20)

RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Gerência de Memória em Java - Parte I (2005)
Gerência de Memória em Java - Parte I (2005)Gerência de Memória em Java - Parte I (2005)
Gerência de Memória em Java - Parte I (2005)
 
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORESARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
 
Função malloc
Função mallocFunção malloc
Função malloc
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Alocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CAlocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem C
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
Gerência de Memória em Java - Parte III (2005)
Gerência de Memória em Java - Parte III (2005)Gerência de Memória em Java - Parte III (2005)
Gerência de Memória em Java - Parte III (2005)
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em C
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
9 - segurança - ataques buffer-injection
9 - segurança -  ataques buffer-injection9 - segurança -  ataques buffer-injection
9 - segurança - ataques buffer-injection
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Cool 3 assembly para linux
Cool 3   assembly para linuxCool 3   assembly para linux
Cool 3 assembly para linux
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na Prática
 
Parte1c
Parte1cParte1c
Parte1c
 
Estrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memóriaEstrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memória
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 
Compiladores
CompiladoresCompiladores
Compiladores
 

Último

SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffffSSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
NarlaAquino
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
marlene54545
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
TailsonSantos1
 

Último (20)

SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffffSSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaPROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
 
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdfTCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéis
 
Estudar, para quê? Ciência, para quê? Parte 1 e Parte 2
Estudar, para quê?  Ciência, para quê? Parte 1 e Parte 2Estudar, para quê?  Ciência, para quê? Parte 1 e Parte 2
Estudar, para quê? Ciência, para quê? Parte 1 e Parte 2
 
migração e trabalho 2º ano.pptx fenomenos
migração e trabalho 2º ano.pptx fenomenosmigração e trabalho 2º ano.pptx fenomenos
migração e trabalho 2º ano.pptx fenomenos
 
Araribá slides 9ano.pdf para os alunos do medio
Araribá slides 9ano.pdf para os alunos do medioAraribá slides 9ano.pdf para os alunos do medio
Araribá slides 9ano.pdf para os alunos do medio
 
EDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVA
EDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVAEDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVA
EDUCAÇÃO ESPECIAL NA PERSPECTIVA INCLUSIVA
 
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
 
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUAO PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
 
Plano de aula Nova Escola períodos simples e composto parte 1.pptx
Plano de aula Nova Escola períodos simples e composto parte 1.pptxPlano de aula Nova Escola períodos simples e composto parte 1.pptx
Plano de aula Nova Escola períodos simples e composto parte 1.pptx
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfPROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
 
Aula de jornada de trabalho - reforma.ppt
Aula de jornada de trabalho - reforma.pptAula de jornada de trabalho - reforma.ppt
Aula de jornada de trabalho - reforma.ppt
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
Aula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIXAula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIX
 
Seminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptxSeminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptx
 

RevisãoAlocaçãodeMemória.pptx

  • 2. 2 Tópicos ● Alocação dinâmica de memória ● Vetores locais e funções
  • 3. 3 Alocação dinâmica ● Uso da memória: – uso de variáveis globais (e estáticas): » espaço reservado para uma variável global existe enquanto o programa estiver sendo executado – uso de variáveis locais: » espaço existe apenas enquanto a função que declarou a variável está sendo executada » liberado para outros usos quando a execução da função termina – variáveis globais ou locais podem ser simples ou vetores: » para vetor, é necessário informar o número máximo de elementos pois o compilador precisa calcular o espaço a ser reservado
  • 4. 4 Alocação dinâmica ● Uso da memória: – alocação dinâmica: » espaço de memória é requisitado em tempo de execução » espaço permanece reservado até que seja explicitamente liberado • depois de liberado, espaço estará disponibilizado para outros usos e não pode mais ser acessado • espaço alocado e não liberado explicitamente, será automaticamente liberado ao final da execução
  • 5. 5 Alocação dinâmica  Uso da memória: – memória estática: » código do programa » variáveis globais » variáveis estáticas – memória dinâmica: » variáveis alocadas dinamicamente » memória livre » variáveis locais Código do programa Variáveis globais e Variáveis estáticas Variáveis alocadas dinamicamente Memória livre Variáveis locais (Pilha de execução) memória estática memória dinâmica
  • 6. 6 Alocação dinâmica Uso da memória: alocação dinâmica de memória: usa a memória livre se o espaço de memória livre for menor que o espaço requisitado, a alocação não é feita e o programa pode prever tratamento de erro pilha de execução: utilizada para alocar memória quando ocorre chamada de função: sistema reserva o espaço para as variáveis locais da função quando a função termina, espaço é liberado (desempilhado) se a pilha tentar crescer mais do que o espaço disponível existente, programa é abortado com erro Código do programa Variáveis globais e Variáveis estáticas Variáveis alocadas dinamicamente Memória livre Variáveis locais (Pilha de execução) memória estática memória dinâmica
  • 7. 7 Alocação dinâmica ● Funções da biblioteca padrão "stdlib.h" – contém uma série de funções pré-definidas: » funções para tratar alocação dinâmica de memória » constantes pré-definidas » ....
  • 8. 8 Alocação dinâmica void * malloc(int num_bytes); void free(void * p);
  • 9. 9 Alocação dinâmica ● Função "malloc": – recebe como parâmetro o número de bytes que se deseja alocar – retorna um ponteiro genérico para o endereço inicial da área de memória alocada, se houver espaço livre: » ponteiro genérico é representado por void* » ponteiro é convertido automaticamente para o tipo apropriado » ponteiro pode ser convertido explicitamente – retorna um endereço nulo, se não houver espaço livre: » representado pelo símbolo NULL ● Operador "sizeof": – retorna o número de bytes ocupado por um tipo ● 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
  • 10. 10 Alocação dinâmica ● Exemplo: – alocação dinâmica de um vetor de inteiros com 10 elementos » malloc retorna o endereço da área alocada para armazenar valores inteiros » ponteiro de inteiro recebe endereço inicial do espaço alocado int *v; v = (int *) malloc(10*sizeof(int));
  • 11. 11 Alocação dinâmica ● Exemplo (cont.): v = (int *) malloc(10*sizeof(int)); 1 - Declaração: int *v v Abre-se espaço na pilha para o ponteiro (variável local) 2 - Comando: v = (int *) malloc (10*sizeof(int)) Reserva espaço de memória da área livre e atribui endereço à variável v 504 Código do Programa Variáveis Globais e Estáticas - Livre Código do Programa Variáveis Globais e Estáticas 504 Livre 40 bytes 1 - Declaração: int *v v Abre-se espaço na pilha para o ponteiro (variável local) 2 - Comando: v = (int *) malloc (10*sizeof(int)) Reserva espaço de memória da área livre e atribui endereço à variável v 504 Código do Programa Variáveis Globais e Estáticas - Livre Código do Programa Variáveis Globais e Estáticas - Livre Código do Programa Variáveis Globais e Estáticas 504 Livre 40 bytes
  • 12. 12 Alocação dinâmica ● Exemplo (cont.): – v armazena endereço inicial de uma área contínua de memória suficiente para armazenar 10 valores inteiros – v pode ser tratado como um vetor declarado estaticamente » v aponta para o inicio da área alocada » v[0] acessa o espaço para o primeiro elemento » v[1] acessa o segundo » .... até v[9]
  • 13. 13 Alocação dinâmica Exemplo (cont.): – tratamento de erro após chamada a malloc » imprime mensagem de erro » aborta o programa (com a função exit) … v = (int*) malloc(10*sizeof(int)); if (v==NULL) { printf("Memoria insuficiente.n"); exit(1); /* aborta o programa e retorna 1 para o sist. operacional */ } … free(v);
  • 14. 14 Alocação dinâmica #include <stdlib.h> int main ( void ) { float *v; float med, var; int i,n; printf("Entre n e depois os valoresn"); scanf("%d",&n); v = (float *) malloc(n*sizeof(float)); if (v==NULL) { printf("Falta memorian"); exit(1); } for ( i = 0; i < n; i++ ) scanf("%f", &v[i]); med = media(n,v); var = variancia(n,v,med); printf ( "Media = %f Variancia = %f n", med, var); free(v); return 0; }
  • 15. 15 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 pelas três componentes x, y, e z   y x y x x z x z z y z y u v v u u v v u u v v u      , , v u
  • 16. 16 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 float* prod_vetorial (float* u, float* v) { float p[3]; p[0] = u[1]*v[2] – v[1]*u[2]; p[1] = u[2]*v[0] – v[2]*u[0]; p[2] = u[0]*v[1] – v[0]*u[1]; return p; }
  • 17. 17 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 » problema - alocação dinâmica para cada chamada da função: • ineficiente do ponto de vista computacional • requer que a função que chama seja responsável pela liberação do espaço float* prod_vetorial (float* u, float* v) { float *p = (float*) malloc(3*sizeof(float)); p[0] = u[1]*v[2] – v[1]*u[2]; p[1] = u[2]*v[0] – v[2]*u[0]; p[2] = u[0]*v[1] – v[0]*u[1]; return p; }
  • 18. 18 Vetores locais a funções – espaço de memória para o resultado passado pela função que chama: » função prod_vetorial recebe três vetores, • dois vetores com dados de entrada • um vetor para armazenar o resultado » solução mais adequada pois não envolve alocação dinâmica void prod_vetorial (float* u, float* v, float* p){ p[0] = u[1]*v[2] – v[1]*u[2]; p[1] = u[2]*v[0] – v[2]*u[0]; p[2] = u[0]*v[1] – v[0]*u[1]; }
  • 19. 19 Resumo Funções para gerência de memória: sizeof retorna o número de bytes ocupado por um tipo malloc recebe o número de bytes que se deseja alocar retorna um ponteiro para o endereço inicial, ou retorna um endereço nulo (NULL) free recebe o ponteiro da memória a ser liberada