SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Prof. Adriano Teixeira de Souza
   A memória de qualquer computador é uma
    seqüência de bytes.

   Cada byte pode armazenar um número
    inteiro entre 0 e 255.

   Cada byte na memória é identificado por um
    endereço numérico, independente do seu
    conteúdo.
Conteúdo        Endereço



    0000 0001   0x0022FF16



    0001 1001   0x0022FF17



    0101 1010   0x0022FF18



    1111 0101   0x0022FF19



    1011 0011   0x0022FF1A
   Cada objeto (variáveis, strings, vetores, etc.) que
    reside na memória do computador ocupa um certo
    número de bytes:
    ◦ Inteiros:           4 bytes consecutivos
    ◦ Caracteres:         1 byte
    ◦ Ponto-flutuante:    4 bytes consecutivos

   Cada objeto tem um endereço.

   Na arquitetura IA-32 (Intel), o endereço é do byte
    menos significativo do objeto.
Variável                        Endereço
                     Valor
                        0001 1001
                                    0x0022FF24
   char string1[4]      0101 1010
                        1111 0101
                        1011 0011
                        0000 0001   0x0022FF14
                        0001 1001
                        0101 1010
                        1111 0101
                        1011 0011
                        0000 0001
                        0001 1001
 float real[4]          0101 1010
                        1111 0101
                        1011 0011
                        0000 0001
                        0001 1001
                        0101 1010
                        1111 0101
                        1011 0011
                        0000 0001
                        0001 1001   0x0022FF10
char string[4]          0101 1010
                        1111 0101
                        1011 0011
int x = 100;

   Ao declararmos uma variável x como acima, temos
    associados a ela os seguintes elementos:
    ◦ Um nome (x)
    ◦ Um endereço de memória ou referência (0xbfd267c4)
    ◦ Um valor (100)
   Para acessarmos o endereço de uma variável,
    utilizamos o operador &
   Um ponteiro (apontador ou pointer) é um tipo
    especial de variável cujo valor é um endereço.

   Um ponteiro pode ter o valor especial NULL,
    quando não contém nenhum endereço.

   NULL é uma constante definida na biblioteca
    stdlib.h.
*var

   A expressão acima representa o conteúdo do
    endereço de memória guardado na variável
    var

   Ou seja, var não guarda um valor, mas sim
    um endereço de memória.
*var


   O símbolo * acima é conhecido como
    operador de indireção.

   A operação acima é conhecida como
    desreferenciamento do ponteiro var.
int x;
int *ap;    // apontador para inteiros
ap = &x;    // ap aponta para x



                0000 0000 (00)    0x0022FF14

           ap   0010 0010 (22)
                 1111 1111 (FF)
                0001 0000 (10)
                   0000 0001      0x0022FF10

           x       0001 1001
                   0101 1010
                   1111 0101
   Há vários tipos de ponteiros:
    ◦   ponteiros   para   caracteres
    ◦   ponteiros   para   inteiros
    ◦   ponteiros   para   ponteiros para inteiros
    ◦   ponteiros   para   vetores
    ◦   ponteiros   para   estruturas

   O compilador C faz questão de saber de que tipo
    de ponteiro você está definindo.
int      *ap_int;      //   apontador   para   int
char     *ap_char;     //   apontador   para   char
float    *ap_float;    //   apontador   para   float
double   *ap_double;   //   apontador   para   double

// apontador para apontador
int          **ap_ap_int;
   Um conjunto limitado de operação
    aritméticas pode ser executado.

   Os ponteiros são endereços de memória.
    Assim, ao somar 1 a um ponteiro, você estará
    indo para o próximo endereço de memória do
    tipo de dado especificado.
int    *ap;




00         00      00
22         22      22
FF         FF      FF
18         14      10


ap         ap+1    ap+2
   Sempre que somar ou subtrair ponteiros,
    deve-se trabalhar com o tamanho do tipo de
    dado utilizado.

   Para isso você pode usar o operador
    sizeof().
   O nome de uma matriz é, na verdade, um ponteiro
    para o primeiro elemento da matriz (endereço
    base)

   Assim, temos duas formas de indexar os elementos
    de uma matriz ou vetor:
    ◦ Usando o operador de indexação (v[4])
    ◦ Usando aritmética de endereços (*(ap_v + 4))
   Ponteiros podem ser organizados em matrizes
    como qualquer outro tipo de dado.

   Nesse caso, basta observar que o operador * tem
    precedência menor que o operador de indexação
    [].


        int *vet_ap[5];
        char *vet_cadeias[5];
   Normalmente, são utilizadas como ponteiros para
    strings, pois uma string é essencialmente um
    ponteiro para o seu primeiro caractere.

     void   systax_error(int num)
     {
            char *erro[] = {
                  "Arquivo nao pode ser aberton",
                  "Erro de leituran",
                  "Erro de escritan",
                  "Falha de midian"};
            printf("%s", erro[num]);
     }
   Um ponteiro para uma função contém o endereço
    da função na memória.

   Da mesma forma que um nome de matriz, um
    nome de função é o endereço na memória do
    começo do código que executa a tarefa da função.

   O uso mais comum de ponteiros para funções é
    permitir que uma função possa ser passada como
    parâmetro para uma outra função.
   Ponteiros de função podem ser:
    ◦   atribuídos a outros ponteiros,
    ◦   passados como argumentos,
    ◦   retornados por funções, e
    ◦   armazenados em matrizes.
   Funções que devolvem ponteiros funcionam da
    mesma forma que os outros tipos de funções

   Alguns detalhes devem ser observados:
    ◦ Ponteiros não são variáveis
    ◦ Quando incrementados, eles apontam para o próximo
      endereço do tipo apontado
    ◦ Por causa disso, o compilador deve saber o tipo apontado
      por cada ponteiro declarado
    ◦ Portanto, uma função que retorna ponteiro deve declarar
      explicitamente qual tipo de ponteiro está retornando
<tipo>    *funcao(.....)
           {
                    ....
                    return (ponteiro);
           }




<tipo> não pode ser void, pois:
• Função deve devolver algum valor
• Ponteiro deve apontar para algum tipo de dado
   Um programa, ao ser executado, divide a memória
    do computador em quatro áreas:
    ◦ Instruções – armazena o código C compilado e montado em
      linguagem de máquina.
    ◦ Pilha – nela são criadas as variáveis locais.
    ◦ Memória estática – onde são criadas as variáveis globais e
      locais estáticas.
    ◦ Heap – destinado a armazenar dados alocados
      dinamicamente.
Instruções



Dados estáticos
                  Embora seu tamanho seja
                  desconhecido, o heap geralmente
Dados dinâmicos   contém uma quantidade
    (Heap)        razoavelmente grande de
                  memória livre.




     Pilha
   As variáveis da pilha e da memória estática
    precisam ter tamanho conhecido antes do
    programa ser compilado.

   A alocação dinâmica de memória permite reservar
    espaços de memória de tamanho arbitrário e
    acessá-los através de apontadores.

   Desta forma, podemos escrever programas mais
    flexíveis, pois nem todos os tamanhos devem ser
    definidos aos escrever o programa.
   A alocação e liberação desses espaços de
    memória é feito por duas funções da
    biblioteca stdlib.h:
    ◦ malloc(): aloca um espaço de memória.
    ◦ free(): libera um espaço de memória.
   Abreviatura de memory allocation
   Aloca um bloco de bytes consecutivos na memória
    e devolve o endereço desse bloco.
   Retorna um ponteiro do tipo void.
   Deve-se utilizar um cast (modelador) para
    transformar o ponteiro devolvido para um ponteiro
    do tipo desejado.
   Exemplo:
    Alocando um vetor de n elementos do tipo inteiro.




     int *p;
     p = (int*) malloc(n * sizeof(int));
   A memória não é infinita. Se a memória do
    computador já estiver toda ocupada, a função
    malloc não consegue alocar mais espaço e devolve
    NULL.

   Usar um ponteiro nulo travará o seu computador
    na maioria dos casos.
   Convém verificar essa possibilidade antes de
    prosseguir.




     ptr = (int*) malloc (1000*sizeof(int));
     if (ptr == NULL)
     {
            printf ("Sem memorian");
     }
     ...
   Libera o uso de um bloco de memória, permitindo
    que este espaço seja reaproveitado.

   O mesmo endereço retornado por uma chamada da
    função malloc() deve ser passado para a função
    free().

   A determinação do tamanho do bloco a ser
    liberado é feita automaticamente.
   Exemplo: liberando espaço ocupado por um vetor
    de 100 inteiros




     int *p;
     p = (int*) malloc(100 * sizeof(int));
     free(p);
   Essa função faz um bloco já alocado crescer ou
    diminuir, preservando o conteúdo já existente:

(tipo*) realloc(tipo *apontador, int novo_tamanho)



    int *x, i;
    x = (int *) malloc(4000*sizeof(int));
    for(i=0;i<4000;i++) x[i] = rand()%100;

    x = (int *) realloc(x, 8000*sizeof(int));

    x = (int *) realloc(x, 2000*sizeof(int));
    free(x);
int *x, i;
x = (int *) malloc(4000*sizeof(int));
                                        x
for(i=0;i<4000;i++) x[i] =
rand()%100;                             x


x = (int *) realloc(x,
                                        x
8000*sizeof(int));

x = (int *) realloc(x,                  x
2000*sizeof(int));
free(x);                                x
#include<stdio.h>
typedef struct
{
   int dia, mes, ano;
} data;
int main (void)
{
   printf ("sizeof (data) = %dn", sizeof (data));
   printf ("sizeof (data *) = %dn", sizeof (data *));
   return 0;
}

                          Prof. Adriano Teixeira de Souza
Prof. Adriano Teixeira de Souza
   Analisando o programa mostrado vemos que não
    se sabe a quantidade de valores que a pessoa vai
    inserir no vetor por esse motivo declaramos um
    vetor muito grande.
   O problema está se a pessoa, por exemplo,
    deseja colocar apenas 3 elementos no vetor.
   Como o vetor foi declarado com o tamanho igual
    a 100, o que acontece é o desperdício de
    memória e caso passe de 100 haverá um estouro.
   Portanto a melhor solução seria utilizar alocação
    dinâmica, ou seja, toda vez que não se sabe ao
    certo a quantidade de elementos a serem
    utilizados deve-se utilizar a alocação dinâmica.


                          Prof. Adriano Teixeira de Souza
Prof. Adriano Teixeira de Souza

Más contenido relacionado

La actualidad más candente

Estrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listasEstrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listas
Adriano Teixeira de Souza
 
Pointers in c
Pointers in cPointers in c
Pointers in c
Mohd Arif
 
Presentation on array
Presentation on array Presentation on array
Presentation on array
topu93
 

La actualidad más candente (20)

Estrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listasEstrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listas
 
Pointers C programming
Pointers  C programmingPointers  C programming
Pointers C programming
 
Arrays in c
Arrays in cArrays in c
Arrays in c
 
set operators.pptx
set operators.pptxset operators.pptx
set operators.pptx
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
 
Control Statements in Java
Control Statements in JavaControl Statements in Java
Control Statements in Java
 
File handling in C++
File handling in C++File handling in C++
File handling in C++
 
Pointers in c
Pointers in cPointers in c
Pointers in c
 
Create table
Create tableCreate table
Create table
 
Sql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosSql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentos
 
Arrays In C++
Arrays In C++Arrays In C++
Arrays In C++
 
Data Structures (CS8391)
Data Structures (CS8391)Data Structures (CS8391)
Data Structures (CS8391)
 
Learn C# Programming - Decision Making & Loops
Learn C# Programming - Decision Making & LoopsLearn C# Programming - Decision Making & Loops
Learn C# Programming - Decision Making & Loops
 
Data Types & Variables in JAVA
Data Types & Variables in JAVAData Types & Variables in JAVA
Data Types & Variables in JAVA
 
Aggregating Data Using Group Functions
Aggregating Data Using Group FunctionsAggregating Data Using Group Functions
Aggregating Data Using Group Functions
 
Presentation on array
Presentation on array Presentation on array
Presentation on array
 
file
filefile
file
 
Banco de Dados MySQL + NetBeans Java + Interface Grafica
Banco de Dados MySQL + NetBeans Java + Interface GraficaBanco de Dados MySQL + NetBeans Java + Interface Grafica
Banco de Dados MySQL + NetBeans Java + Interface Grafica
 
Java: Primitive Data Types
Java: Primitive Data TypesJava: Primitive Data Types
Java: Primitive Data Types
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 

Destacado

Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Contatonalua
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Adriano Teixeira de Souza
 
Neuropsicologia hoje
Neuropsicologia hojeNeuropsicologia hoje
Neuropsicologia hoje
Hamarmoises
 

Destacado (17)

Instalacao ubuntu
Instalacao ubuntuInstalacao ubuntu
Instalacao ubuntu
 
SO-05 Gerenciamento de Memória e Alocação
SO-05 Gerenciamento de Memória e AlocaçãoSO-05 Gerenciamento de Memória e Alocação
SO-05 Gerenciamento de Memória e Alocação
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 
Apostila de Alocação Dinâmica em C
Apostila de Alocação Dinâmica em CApostila de Alocação Dinâmica em C
Apostila de Alocação Dinâmica em C
 
Listas Encadeadas
Listas EncadeadasListas Encadeadas
Listas Encadeadas
 
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
 
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
 
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
 
Processo Penal Ordinario
Processo Penal OrdinarioProcesso Penal Ordinario
Processo Penal Ordinario
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Como diagramar o seu livro
Como diagramar o seu livroComo diagramar o seu livro
Como diagramar o seu livro
 
Lógica Proposicional
Lógica ProposicionalLógica Proposicional
Lógica Proposicional
 
Gerenciamneto de projetos captação de pó
Gerenciamneto de projetos captação de póGerenciamneto de projetos captação de pó
Gerenciamneto de projetos captação de pó
 
Neuropsicologia hoje
Neuropsicologia hojeNeuropsicologia hoje
Neuropsicologia hoje
 

Similar a Estrutura de Dados - Alocação dinâmica de memória

Resumo tipo primitivo_java
Resumo tipo primitivo_javaResumo tipo primitivo_java
Resumo tipo primitivo_java
Marcos Souza
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
gjpbg
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
Leandro Lopes
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
RUI VIEIRA
 

Similar a Estrutura de Dados - Alocação dinâmica de memória (20)

Conceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersConceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffers
 
Ud3
Ud3Ud3
Ud3
 
Ed1
Ed1Ed1
Ed1
 
Aula04 ponteiros e conversao
Aula04   ponteiros e conversaoAula04   ponteiros e conversao
Aula04 ponteiros e conversao
 
Resumo tipo primitivo_java
Resumo tipo primitivo_javaResumo tipo primitivo_java
Resumo tipo primitivo_java
 
Estruturas
EstruturasEstruturas
Estruturas
 
Cool 3 assembly para linux
Cool 3   assembly para linuxCool 3   assembly para linux
Cool 3 assembly para linux
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
 
Aula 6 pc - slides
Aula 6   pc - slidesAula 6   pc - slides
Aula 6 pc - slides
 
Função malloc
Função mallocFunção malloc
Função malloc
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Pged 02
Pged 02Pged 02
Pged 02
 
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de códigoAula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Pged 01
Pged 01Pged 01
Pged 01
 
Aula 1
Aula 1Aula 1
Aula 1
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
 

Más de Adriano Teixeira de Souza

Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores Binárias
Adriano Teixeira de Souza
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)
Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Adriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Adriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Adriano Teixeira de Souza
 
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Adriano Teixeira de Souza
 
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Adriano Teixeira de Souza
 

Más de Adriano Teixeira de Souza (20)

Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores Binárias
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
 
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
 
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
 
Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)
 
Responsive web design
Responsive web designResponsive web design
Responsive web design
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
 
Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
 
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
 
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
 
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
 

Último

Último (8)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 

Estrutura de Dados - Alocação dinâmica de memória

  • 2. A memória de qualquer computador é uma seqüência de bytes.  Cada byte pode armazenar um número inteiro entre 0 e 255.  Cada byte na memória é identificado por um endereço numérico, independente do seu conteúdo.
  • 3. Conteúdo Endereço 0000 0001 0x0022FF16 0001 1001 0x0022FF17 0101 1010 0x0022FF18 1111 0101 0x0022FF19 1011 0011 0x0022FF1A
  • 4. Cada objeto (variáveis, strings, vetores, etc.) que reside na memória do computador ocupa um certo número de bytes: ◦ Inteiros: 4 bytes consecutivos ◦ Caracteres: 1 byte ◦ Ponto-flutuante: 4 bytes consecutivos  Cada objeto tem um endereço.  Na arquitetura IA-32 (Intel), o endereço é do byte menos significativo do objeto.
  • 5. Variável Endereço Valor 0001 1001 0x0022FF24 char string1[4] 0101 1010 1111 0101 1011 0011 0000 0001 0x0022FF14 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 float real[4] 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0x0022FF10 char string[4] 0101 1010 1111 0101 1011 0011
  • 6. int x = 100;  Ao declararmos uma variável x como acima, temos associados a ela os seguintes elementos: ◦ Um nome (x) ◦ Um endereço de memória ou referência (0xbfd267c4) ◦ Um valor (100)  Para acessarmos o endereço de uma variável, utilizamos o operador &
  • 7. Um ponteiro (apontador ou pointer) é um tipo especial de variável cujo valor é um endereço.  Um ponteiro pode ter o valor especial NULL, quando não contém nenhum endereço.  NULL é uma constante definida na biblioteca stdlib.h.
  • 8. *var  A expressão acima representa o conteúdo do endereço de memória guardado na variável var  Ou seja, var não guarda um valor, mas sim um endereço de memória.
  • 9. *var  O símbolo * acima é conhecido como operador de indireção.  A operação acima é conhecida como desreferenciamento do ponteiro var.
  • 10. int x; int *ap; // apontador para inteiros ap = &x; // ap aponta para x 0000 0000 (00) 0x0022FF14 ap 0010 0010 (22) 1111 1111 (FF) 0001 0000 (10) 0000 0001 0x0022FF10 x 0001 1001 0101 1010 1111 0101
  • 11. Há vários tipos de ponteiros: ◦ ponteiros para caracteres ◦ ponteiros para inteiros ◦ ponteiros para ponteiros para inteiros ◦ ponteiros para vetores ◦ ponteiros para estruturas  O compilador C faz questão de saber de que tipo de ponteiro você está definindo.
  • 12. int *ap_int; // apontador para int char *ap_char; // apontador para char float *ap_float; // apontador para float double *ap_double; // apontador para double // apontador para apontador int **ap_ap_int;
  • 13. Um conjunto limitado de operação aritméticas pode ser executado.  Os ponteiros são endereços de memória. Assim, ao somar 1 a um ponteiro, você estará indo para o próximo endereço de memória do tipo de dado especificado.
  • 14. int *ap; 00 00 00 22 22 22 FF FF FF 18 14 10 ap ap+1 ap+2
  • 15. Sempre que somar ou subtrair ponteiros, deve-se trabalhar com o tamanho do tipo de dado utilizado.  Para isso você pode usar o operador sizeof().
  • 16. O nome de uma matriz é, na verdade, um ponteiro para o primeiro elemento da matriz (endereço base)  Assim, temos duas formas de indexar os elementos de uma matriz ou vetor: ◦ Usando o operador de indexação (v[4]) ◦ Usando aritmética de endereços (*(ap_v + 4))
  • 17. Ponteiros podem ser organizados em matrizes como qualquer outro tipo de dado.  Nesse caso, basta observar que o operador * tem precedência menor que o operador de indexação []. int *vet_ap[5]; char *vet_cadeias[5];
  • 18. Normalmente, são utilizadas como ponteiros para strings, pois uma string é essencialmente um ponteiro para o seu primeiro caractere. void systax_error(int num) { char *erro[] = { "Arquivo nao pode ser aberton", "Erro de leituran", "Erro de escritan", "Falha de midian"}; printf("%s", erro[num]); }
  • 19. Um ponteiro para uma função contém o endereço da função na memória.  Da mesma forma que um nome de matriz, um nome de função é o endereço na memória do começo do código que executa a tarefa da função.  O uso mais comum de ponteiros para funções é permitir que uma função possa ser passada como parâmetro para uma outra função.
  • 20. Ponteiros de função podem ser: ◦ atribuídos a outros ponteiros, ◦ passados como argumentos, ◦ retornados por funções, e ◦ armazenados em matrizes.
  • 21. Funções que devolvem ponteiros funcionam da mesma forma que os outros tipos de funções  Alguns detalhes devem ser observados: ◦ Ponteiros não são variáveis ◦ Quando incrementados, eles apontam para o próximo endereço do tipo apontado ◦ Por causa disso, o compilador deve saber o tipo apontado por cada ponteiro declarado ◦ Portanto, uma função que retorna ponteiro deve declarar explicitamente qual tipo de ponteiro está retornando
  • 22. <tipo> *funcao(.....) { .... return (ponteiro); } <tipo> não pode ser void, pois: • Função deve devolver algum valor • Ponteiro deve apontar para algum tipo de dado
  • 23. Um programa, ao ser executado, divide a memória do computador em quatro áreas: ◦ Instruções – armazena o código C compilado e montado em linguagem de máquina. ◦ Pilha – nela são criadas as variáveis locais. ◦ Memória estática – onde são criadas as variáveis globais e locais estáticas. ◦ Heap – destinado a armazenar dados alocados dinamicamente.
  • 24. Instruções Dados estáticos Embora seu tamanho seja desconhecido, o heap geralmente Dados dinâmicos contém uma quantidade (Heap) razoavelmente grande de memória livre. Pilha
  • 25. As variáveis da pilha e da memória estática precisam ter tamanho conhecido antes do programa ser compilado.  A alocação dinâmica de memória permite reservar espaços de memória de tamanho arbitrário e acessá-los através de apontadores.  Desta forma, podemos escrever programas mais flexíveis, pois nem todos os tamanhos devem ser definidos aos escrever o programa.
  • 26. A alocação e liberação desses espaços de memória é feito por duas funções da biblioteca stdlib.h: ◦ malloc(): aloca um espaço de memória. ◦ free(): libera um espaço de memória.
  • 27. Abreviatura de memory allocation  Aloca um bloco de bytes consecutivos na memória e devolve o endereço desse bloco.  Retorna um ponteiro do tipo void.  Deve-se utilizar um cast (modelador) para transformar o ponteiro devolvido para um ponteiro do tipo desejado.
  • 28. Exemplo: Alocando um vetor de n elementos do tipo inteiro. int *p; p = (int*) malloc(n * sizeof(int));
  • 29. A memória não é infinita. Se a memória do computador já estiver toda ocupada, a função malloc não consegue alocar mais espaço e devolve NULL.  Usar um ponteiro nulo travará o seu computador na maioria dos casos.
  • 30. Convém verificar essa possibilidade antes de prosseguir. ptr = (int*) malloc (1000*sizeof(int)); if (ptr == NULL) { printf ("Sem memorian"); } ...
  • 31. Libera o uso de um bloco de memória, permitindo que este espaço seja reaproveitado.  O mesmo endereço retornado por uma chamada da função malloc() deve ser passado para a função free().  A determinação do tamanho do bloco a ser liberado é feita automaticamente.
  • 32. Exemplo: liberando espaço ocupado por um vetor de 100 inteiros int *p; p = (int*) malloc(100 * sizeof(int)); free(p);
  • 33. Essa função faz um bloco já alocado crescer ou diminuir, preservando o conteúdo já existente: (tipo*) realloc(tipo *apontador, int novo_tamanho) int *x, i; x = (int *) malloc(4000*sizeof(int)); for(i=0;i<4000;i++) x[i] = rand()%100; x = (int *) realloc(x, 8000*sizeof(int)); x = (int *) realloc(x, 2000*sizeof(int)); free(x);
  • 34. int *x, i; x = (int *) malloc(4000*sizeof(int)); x for(i=0;i<4000;i++) x[i] = rand()%100; x x = (int *) realloc(x, x 8000*sizeof(int)); x = (int *) realloc(x, x 2000*sizeof(int)); free(x); x
  • 35. #include<stdio.h> typedef struct { int dia, mes, ano; } data; int main (void) { printf ("sizeof (data) = %dn", sizeof (data)); printf ("sizeof (data *) = %dn", sizeof (data *)); return 0; } Prof. Adriano Teixeira de Souza
  • 37. Analisando o programa mostrado vemos que não se sabe a quantidade de valores que a pessoa vai inserir no vetor por esse motivo declaramos um vetor muito grande.  O problema está se a pessoa, por exemplo, deseja colocar apenas 3 elementos no vetor.  Como o vetor foi declarado com o tamanho igual a 100, o que acontece é o desperdício de memória e caso passe de 100 haverá um estouro.  Portanto a melhor solução seria utilizar alocação dinâmica, ou seja, toda vez que não se sabe ao certo a quantidade de elementos a serem utilizados deve-se utilizar a alocação dinâmica. Prof. Adriano Teixeira de Souza