SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
Curso Superior de Tecnologia em Telemática
                                Programação e Estruturas de Dados

Linguagem C: Estruturas e Alocação Dinâmica
                                                     Copyright©2010
                                                     Prof. César Rocha
                                              cesarocha@ifpb.edu.br 1
Objetivos

§ Explorar os conceitos fundamentais acerca da
  alocação dinâmica de memória em C
   § Quando e como alocar memória, principais funções e
     bibliotecas da linguagem C, como acessar áreas
     alocadas, boas práticas de programação, quando e
     como liberar memória.
§ Apresentar os mecanismos fundamentais da
  linguagem C para a estruturação de tipos
   § Por que estruturar código, como acessar os campos de
     uma estrutura, uso de typedef, ponteiros para
     estruturas, passando estruturas para funções, boas
     práticas e alocação dinâmica de estruturas             2
Estrutura de Dados I




  Parte I - Alocação
Dinâmica de Memória

                               3
Motivação

§ Até aqui, na declaração de um vetor, foi preciso
  dimensioná-lo (seja diretamente ou seja v[n] )
   § Isto nos obrigava a saber, de antemão, o número
     máximo de elementos no vetor durante a codificação
§ Em alguns cenários, este pré-dimensionamento de
  memória é um fator muito limitante.
   § Imagine uma função que possa receber um vetor (de
     tamanho desconhecido) e tenha de criar um outro
     vetor de mesmo conteúdo (um clone) do original
      § Devo dimensionar o vetor clone com um número
        absurdamente alto ou ser modesto (e não prever vetores
        de tamanho maiores) ?                                 4
Motivação

§ Felizmente, C oferece meios de requisitar espaços
  de memória em tempo de execução
   § Dizemos que é possível alocar memória
     dinamicamente
§ Assim, teremos programas que utilizam recursos de
  memória de maneira mais versátil
   § Só utilizam a memória quando necessário
   § Se adaptam aos recursos disponíveis da máquina
§ Todas as operações de acesso e alteração dos dados
  alocados dinamicamente são feitas a partir dos
  apontadores                                        5
Conceitos

§ Em C, basicamente, há três formas de se alocar
  memória, conforme a seguir:
   Œ Estaticamente: uso de variáveis globais e variáveis
    locais estáticas declaradas dentro de funções. Estas
    são liberadas apenas com o término do programa
   • Implicitamente: uso de variáveis locais. O espaço
    existe apenas enquanto a função que declarou a
    variável está sendo executada
   Ž Dinamicamente: em tempo de execução, pode-se
    alocar um espaço de um determinado tamanho
    desejado. Este permanece reservado até que
    explicitamente seja liberado pelo programa(dor).       6
Graficamente

        Alocação Esquemática da Memória
                                                                Código do
include <stdio.h>
                                                                Programa         Œ
int main( int argc, i
  char *str;
                          O sistema operacional aloca o
  printf(“%s de cliente   código de máquina na memória.
  // Numerical results
  printf(“Digite o pr                                        Variáveis globais   Œ
                           Ele reserva também os espaços
                           necessários para armazenar as        Alocação
                           variáveis globais (e estáticas)      dinâmica         Ž
                           existentes no programa.

       Esta área livre de memória é requisitada não
       somente pelas chamadas de função na pilha,
       mas também pelas alocações em tempo de
       execução.
               O restante da memória livre é utilizado
               pelas variáveis locais (na pilha) e pelos          Pilha          •
               espaços alocados dinamicamente.                                   7
malloc()

§ malloc() é a principal função de alocação dinâmica
  de memória presente na stdlib.h
   § Ela 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.

          void *malloc(size_t tamanho);
   § Se o espaço de memória livre for menor que o espaço
     requisitado dinamicamente, malloc() retorna um
     apontador nulo (NULL)
   § O apontador também será utilizado quando se for fazer
     a liberação da área de memória alocada
                                                             8
malloc()

§ Por questões de portabilidade entre compiladores,
  utilize o operador sizeof() em vez de atribuir
  manualmente o tamanho em bytes do tipo
§ Devemos lembrar que a função malloc é usada para
  alocar espaço de qualquer tipo, daí o cast explícito
    // Considere o código abaixo na alocação de um vetor de inteiros
    // Considere o código abaixo na alocação de um vetor de inteiros
    // de 4 células
    // de 4 células
    #include <stdlib.h>
    #include <stdlib.h>
    int main(void) {
    int main(void)
         int *v;
         int *v;
         v = (int*) malloc ( 4 * sizeof( int ) );
         v = (int*) malloc ( 4 * sizeof( int ) );
         v[0] = 23; …
         v[0] = 23; …
    }
    }
                                                                       9
Graficamente
             int *v;               v = (int *) malloc (4*sizeof(int))
    Abre-se espaço na pilha para   Reserva espaço de memória na área livre e
     o ponteiro (variável local)           atribui endereço à variável


           Código do                             Código do
           Programa                              Programa


       Variáveis globais                     Variáveis globais
                                   0x3294
                                                   08 bytes




V           #@$%&                   V              0x3294

             Pilha                                 Pilha                  10
Tratamento de erros

§ É fundamental testar se a alocação teve ou não
  sucesso antes de usar o apontador retornado
    // Considere o código abaixo na alocação de um vetor de inteiros
    // Considere o código abaixo na alocação
    // de tamanho 4
    // de tamanho
    #include <stdlib.h>
    #include <stdlib.h>
    int main(void) {
    int main(void) {
         int *v;
         int *v;
         v = (int*) malloc ( 4 * sizeof( int ) );
         v = (int*)
         if (v==NULL) {
         if (v==NULL) {
            puts( "Memória insuficiente.n“ );
            puts(
            return(1); // aborta o programa e retorna 1 para o SO
            return(1); // aborta o programa
         }
         }
         v[0] = 23; …
         v[0] = 23; …
    }
    }
                                                                       11
free()

§ Para liberar um espaço de memória alocado
  dinamicamente, usamos a função free()
  § Esta função recebe como parâmetro o ponteiro
    contendo o endereço da memória a ser liberada.
               void free( void *pt );
  § Só podemos passar para esta função um endereço de
    memória que tenha sido alocado dinamicamente.
  § Devemos lembrar ainda que não podemos acessar o
    espaço na memória depois que o liberamos.
  § O uso de um apontador inválido passado como
    parâmetro para free pode derrubar o sistema.        12
free()

§ Diferente de outras linguagens, é tarefa do
  programador liberar memória com free()
    // Considere o código abaixo na alocação de um vetor de inteiros
    // Considere o código abaixo na alocação
    // de tamanho 4
    // de tamanho 4
    #include <stdlib.h>
    #include <stdlib.h>
    int main(void) {
    int main(void) {
         int *v;
         int *v;
         v = (int*) malloc ( 4 * sizeof( int ) );
         v = (int*) malloc ( 4 * sizeof( int )
         if (v==NULL) {
         if (v==NULL) {
            puts( "Memória insuficiente.n“ );
            puts( "Memória insuficiente.n“
            return(1); // aborta o programa e retorna 1 para o SO
            return(1); // aborta o programa
         }
         }
         v[0] = 23; …
         v[0] = 23; …
         free( v );
         free( v );
    }
    }                                                                13
Exercícios

§ Utilizando-se de alocação dinâmica de memória,
  implemente uma função que receba como
  parâmetro uma cadeia de caracteres digitada pelo
  usuário e retorne uma cópia desta cadeia alocada
  dinamicamente.
§ O protótipo desta função pode ser dado por:
             char* duplica (char* s);
§ Imprima a cópia ao final da duplicação
§ A função que chama duplica ficará responsável por
  liberar o espaço alocado.
                                                  14
Estrutura de Dados I




Parte 2 – Estruturas


                           15
Motivação

   § Vimos que C suporta tipos básicos (char, int, float,
     double, ...) vetores e ponteiros para estes tipos
        § Muitas vezes, na modelagem de uma entidade mais
          complexa do mundo real para o computacional, o
          programador C realiza esta tarefa apenas reunindo
          vários valores de tipos mais simples.
              § Ex: entidade livro num sistema de biblioteca
/* livro 1 */
int cod; char titulo[40]; float preco;
     cod;     titulo[40]; float preco;
/* livro 2 */
int cod2; char titulo2[40]; float preco2;
     cod2;      titulo2[40]; float preco2;

   Deste modo, os campos ficam dissociados e, no caso de vários livros, cabe ao
   programador não misturar campos de um livro com os de outro.                   16
Motivação

§ Para amenizar este problema, C oferece recursos
  para agruparmos dados
     § Potencializar a coesão e semântica da entidade
     § Programas mais fáceis e com melhor legibilidade.
     § A definição de uma estrutura forma um modelo para
       representação de um TAD (Tipo Abstrato de Dado)
     /* estruturação */                                               Biblioteca
                                                                      Biblioteca
                                                                      Catálogo
                                                                       Catálogo
     struct livro {
              livro {              Lógica procedural                            Livro
                                                                                Livro
        int cod;
            cod;                      agrupada em                 Livro
                                                                  Livro       Autor
                                                                              Autor
        char titulo[40];
               titulo[40];        estruturas pequenas           Autor
                                                                Autor
        float preco; ..                                         Autor
                                                                Autor           Livro
                                                                                Livro
                                                                              Autor
                                                                              Autor
     };
Na estrutura acima, podemos agrupar os dados básicos numa estrutura única e
coesa. O programador C pode criar entidades mais próximas do mundo real.                17
struct

§ Uma estrutura em C serve basicamente para
  agrupar diversas variáveis dentro de um único
  contexto.
    § Coleção de variáveis são referenciadas por um nome
    § Os membros de uma estrutura são geralmente
      chamados de elementos ou campos
        struct <identificador> {
        struct                                 struct aluno {
                                               struct aluno {
           tipo nomeVariavel;
           tipo nomeVariavel;                     int matricula;
           tipo nomeVariavel;
           tipo nomeVariavel;                     char nome[40];
           ...
           ...                                    int idade;
        } variaveis estrutura;
        } variaveis estrutura;                 } aluno1, aluno2;

Onde: <identificador> ou variáveis estrutura podem ser omitidos, mas nunca ambos!   18
Acessando os campos

§ Os elementos de uma estrutura podem ser
  acessados através do operador de acesso “ponto” (.)
    #include <stdlib.h>
    struct ponto { // definição to TAD ponto que possui coordenadas
        float x; // coordenada X do ponto
        float y; // coordenada Y do ponto
    };
    int main(void) {
        struct ponto p1; // declaração variável p1 do tipo ponto
        printf( "Digite as coordenadas do ponto( x, y ):" );
                                                           );
        scanf( "%f %f", &p1.x, &p1.y );
                "%f %f", &p1.x, &p1.y );
        printf( "O ponto fornecido foi: (%.2f,%.2f)n", p1.x, p1.y );
                 "O ponto fornecido foi: (%.2f,%.2f)n",
        return 0;
    }
                                                                        19
typedef

§ Visando simplificar (ou abreviar) nomes de tipos e
  para tratarmos tipos complexos, é recomendado o
  uso de typedef
§ Por exemplo:
     struct ponto {
                  {           typedef struct {
         float x;               float x;
         float y;               float y;
     }                        } Ponto; // novo tipo
                                Ponto;
     struct ponto p1;
                  p1;         Ponto p1;
                                    p1;

§ Vale lembrar que typedef permite nomear quaisquer
  outros tipos de dados (float, int, …)
                                                        20
Ponteiros para estruturas

§ Da mesma forma que podemos declarar um
  ponteiro para uma variável comum, podemos
  armazenar o endereço de uma estrutura
   § Muito útil em passagem de estruturas para funções
     (veremos mais adiante)
§ É possível acessar os campos dessa estrutura
  indiretamente através deste ponteiro
   § Operador seta -> é utilizado para acessar os
     elementos de uma estrutura que foi passada como
     ponteiro;

                                                         21
Ponteiros para estruturas

§ Exemplo:
   #include <stdlib.h>
   typedef struct { // definição TAD ponto com coordenadas
       float x; // coordenada X do ponto
       float y; // coordenada Y do ponto
   } Ponto;
   int main(void) {
       Ponto p1; // declaração variável p1 do tipo ponto
       Ponto *pt; // declaração do ponteiro para estrutura
       p1.x = 5; p1.y = 4; // acesso as variáveis via operador ‘.’
       p2 = &p1; // faz pt apontar para endereco da estrutura
           =
       p2->x = 10; p2->y = 20 // acesso aos campos via ->
       printf( “Coordenadas de p1: (%.2f,%.2f)n", p1.x, p1.y );
       return 0;
   }                                                                 22
Resumo

§ Em síntese, se temos uma variável estrutura e
  queremos acessar seus campos, usamos o operador
  de acesso ponto
§ Se temos uma variável ponteiro para estrutura,
  usamos o operador de acesso seta
§ Finalmente e, seguindo o raciocínio, se temos uma
  variável ou um ponteiro e queremos acessar o
  endereço de um campo, fazemos &
  § Ex: scanf("%f %f", &var.x, &var.y);
        scanf("%f %f", &pt->x, &pt->y);
                                                      23
Passando estruturas para funções

§ Vimos, no módulo anterior, que a passagem por
  parâmetros em C se dá fundamentalmente por valor
   § Não era possível alterar a variável original e sim apenas
     o parâmetro local, dentro da função
   § Era necessário utilizar o operador & quando queríamos
     passar não uma cópia, mas o endereço da variável
§ Porém, no caso de estruturas, considere a função:
     void captura (struct ponto p1) {
       puts( "Digite as coordenadas (x y): " );
       scanf("%f %f", &p.x, &p.y);
     }                  Preste atenção nos pontos críticos!
                                           pontos críticos!   24
Passando estruturas para funções

§ Existem alguns pontos críticos a serem
  considerados:
   § Copiar uma estrutura inteira para a pilha pode ser uma
     operação onerosa para o compilador. E se a estrutura
     tivesse 30 campos?
   § Não é possível alterar os campos da estrutura original
§ Altamente recomendado:
   § É mais conveniente passar apenas o ponteiro da
     estrutura, mesmo que não seja necessário alterar os
     valores dos elementos dentro da função
       O que deve ser feito para corrigir a função anterior?
                                 corrigir função anterior?     25
Passando estruturas para funções

§ Exemplo:
   void captura (struct ponto* pt) {
        printf("Digite as coordenadas do ponto(x y): ");
        scanf("%f %f", &pt->x, &pt->y);
       }
        void imprime (struct ponto* pt) {
        printf("O ponto fornecido: (%.2f,%.2f)n", pt->x, pt->y);
       }
   // função principal
   int main(void) {
        struct ponto p;
        captura(&p);
        imprime(&p);
        return 0;
   }
                                                                    26
Alocação dinâmica de estruturas

§ Da mesma forma que fizemos com vetores, as
  estruturas podem ser alocadas dinamicamente:
   #include <stdlib.h>
   typedef struct { // definição TAD ponto com coordenadas
       float x; // coordenada X do ponto
       float y; // coordenada Y do ponto
   } Ponto;
   int main(void) {
       Ponto *pt; // declaração do ponteiro para estrutura
       pt = ( Ponto* ) malloc ( sizeof ( Ponto ) );
                                         Ponto ) );
       if (pt==NULL) {
          puts( "Memória insuficiente.n“ );
          return 1; // aborta o programa e retorna 1 para o SO
       }
       pt->x = 42; …
       pt->x
       free(pt);                                                 27
Exercícios

§ (Para profissionais!) Escreva uma função que tenha
  como valor de retorno a distância entre dois pontos.
   § O protótipo da função final pode ser dado por:
  float distancia( struct Ponto *p1,
                   struct Ponto *p2 );
   § Primeiro, crie os dois pontos (duas estruturas) alocados
     dinamicamente em memória. Depois, calcule a
     distância entre os pontos com base na fórmula abaixo:

           d = ( x 2 - x1) 2 + ( y 2 - y1) 2
   § A função que chama distancia ficará responsável por
     imprimir o resultado e liberar o espaço alocado
                                                            28
Para um bom aproveitamento:

§ Codifique os exemplos mostrados nestes slides e
  verifique pontos de dúvidas
§ Resolva todas as questões da lista de alocação
  dinâmica e estruturas
§ Procure o professor ou monitor da disciplina e
  questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto
  para a primeira avaliação.
   § Este é apenas um dos assuntos abordados na prova!

                                                         29

Mais conteúdo relacionado

Mais procurados

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 CGlécio Rodrigues
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem Capolllorj
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem cJefferson Bessa
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Kratos879
 
Algoritmos e Lógica de Programação
Algoritmos e Lógica de ProgramaçãoAlgoritmos e Lógica de Programação
Algoritmos e Lógica de ProgramaçãoJose Augusto Cintra
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordidaBonoBee
 
Conjunto de instruções mips - introdução
Conjunto de instruções mips - introduçãoConjunto de instruções mips - introdução
Conjunto de instruções mips - introduçãoElaine Cecília Gatto
 
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 CElaine Cecília Gatto
 

Mais procurados (20)

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
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Compiladores 7
Compiladores 7Compiladores 7
Compiladores 7
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
 
Pged 01
Pged 01Pged 01
Pged 01
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
TDC2014 SP - C/C++ - Modularização de Código C
TDC2014 SP - C/C++ - Modularização de Código CTDC2014 SP - C/C++ - Modularização de Código C
TDC2014 SP - C/C++ - Modularização de Código C
 
Ud2
Ud2Ud2
Ud2
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Compiladores 1
Compiladores 1Compiladores 1
Compiladores 1
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
 
Algoritmos e Lógica de Programação
Algoritmos e Lógica de ProgramaçãoAlgoritmos e Lógica de Programação
Algoritmos e Lógica de Programação
 
Aula09 traducaosin110
Aula09 traducaosin110Aula09 traducaosin110
Aula09 traducaosin110
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Conjunto de instruções mips - introdução
Conjunto de instruções mips - introduçãoConjunto de instruções mips - introdução
Conjunto de instruções mips - introdução
 
Resumo assembly x86 16 bits
Resumo assembly x86 16 bitsResumo assembly x86 16 bits
Resumo assembly x86 16 bits
 
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
 

Destaque

Estruturas em c joão carlos batista
Estruturas em c   joão carlos batistaEstruturas em c   joão carlos batista
Estruturas em c joão carlos batistaJoao Carlos Batista
 
Aula 1 módulo v - psi
Aula 1  módulo v - psiAula 1  módulo v - psi
Aula 1 módulo v - psi111111119
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04thomasdacosta
 
Linguagem C 08 Definicao De Tipos
Linguagem C 08 Definicao De TiposLinguagem C 08 Definicao De Tipos
Linguagem C 08 Definicao De TiposRegis Magalhães
 
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaEstrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaLeinylson Fontinele
 
Estruturas de Dados em C#
Estruturas de Dados em C#Estruturas de Dados em C#
Estruturas de Dados em C#Marcelo Charan
 
Livro -estruturas_de_dados_e_algoritmos_em_c.erivanildo
Livro  -estruturas_de_dados_e_algoritmos_em_c.erivanildoLivro  -estruturas_de_dados_e_algoritmos_em_c.erivanildo
Livro -estruturas_de_dados_e_algoritmos_em_c.erivanildoFernando Chuva
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADLeinylson Fontinele
 
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,...Leinylson Fontinele
 
1008 ProgramaçãO C Completo
1008 ProgramaçãO C Completo1008 ProgramaçãO C Completo
1008 ProgramaçãO C CompletoFxx
 

Destaque (20)

Função malloc
Função mallocFunção malloc
Função malloc
 
Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
 
Estruturas
EstruturasEstruturas
Estruturas
 
Estruturas em c joão carlos batista
Estruturas em c   joão carlos batistaEstruturas em c   joão carlos batista
Estruturas em c joão carlos batista
 
Keep in shape
Keep in shapeKeep in shape
Keep in shape
 
Aula 1 módulo v - psi
Aula 1  módulo v - psiAula 1  módulo v - psi
Aula 1 módulo v - psi
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Aula 4 vetores
Aula 4  vetoresAula 4  vetores
Aula 4 vetores
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Módulo 1 de PSI
Módulo 1 de PSIMódulo 1 de PSI
Módulo 1 de PSI
 
Linguagem C 08 Definicao De Tipos
Linguagem C 08 Definicao De TiposLinguagem C 08 Definicao De Tipos
Linguagem C 08 Definicao De Tipos
 
Apostila C ANSI
Apostila C ANSIApostila C ANSI
Apostila C ANSI
 
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaEstrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
 
Estruturas de Dados em C#
Estruturas de Dados em C#Estruturas de Dados em C#
Estruturas de Dados em C#
 
Vetores
VetoresVetores
Vetores
 
Aula 21 vetores
Aula 21   vetoresAula 21   vetores
Aula 21 vetores
 
Livro -estruturas_de_dados_e_algoritmos_em_c.erivanildo
Livro  -estruturas_de_dados_e_algoritmos_em_c.erivanildoLivro  -estruturas_de_dados_e_algoritmos_em_c.erivanildo
Livro -estruturas_de_dados_e_algoritmos_em_c.erivanildo
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
 
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,...
 
1008 ProgramaçãO C Completo
1008 ProgramaçãO C Completo1008 ProgramaçãO C Completo
1008 ProgramaçãO C Completo
 

Semelhante a Pged 02

Alocação dinâmica em C
Alocação dinâmica em CAlocação dinâmica em C
Alocação dinâmica em CBruno Oliveira
 
RevisãoAlocaçãodeMemória.pptx
RevisãoAlocaçãodeMemória.pptxRevisãoAlocaçãodeMemória.pptx
RevisãoAlocaçãodeMemória.pptxClaudia Ferlin
 
Gabarito da P1 de PROG
Gabarito da P1 de PROGGabarito da P1 de PROG
Gabarito da P1 de PROGMarcos de Vita
 
Introdução a linguagem de programação C
Introdução a linguagem de programação CIntrodução a linguagem de programação C
Introdução a linguagem de programação CSchoolByte
 
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ídaDeivid Martins
 
Curso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação CCurso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação CJoberthSilva
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoJorge Cardoso
 
Linguagem c wellington telles - aula 02
Linguagem c   wellington telles - aula 02Linguagem c   wellington telles - aula 02
Linguagem c wellington telles - aula 02profwtelles
 
Apostila de-introdução-à-linguagem-c
Apostila de-introdução-à-linguagem-cApostila de-introdução-à-linguagem-c
Apostila de-introdução-à-linguagem-cMaicon Rodrigues
 
Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...Luís Gustavo Martins
 
Conceitos fundamentais de_programacao
Conceitos fundamentais de_programacao Conceitos fundamentais de_programacao
Conceitos fundamentais de_programacao Jorge Cardoso
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
Introdução à Programacao em Processing
Introdução à Programacao em Processing Introdução à Programacao em Processing
Introdução à Programacao em Processing Jorge Cardoso
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxClaudia Ferlin
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducaommind
 

Semelhante a Pged 02 (20)

Alocação dinâmica em C
Alocação dinâmica em CAlocação dinâmica em C
Alocação dinâmica em C
 
RevisãoAlocaçãodeMemória.pptx
RevisãoAlocaçãodeMemória.pptxRevisãoAlocaçãodeMemória.pptx
RevisãoAlocaçãodeMemória.pptx
 
Gabarito da P1 de PROG
Gabarito da P1 de PROGGabarito da P1 de PROG
Gabarito da P1 de PROG
 
Introdução a linguagem de programação C
Introdução a linguagem de programação CIntrodução a linguagem de programação C
Introdução a linguagem de programação C
 
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
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Curso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação CCurso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação C
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
 
Linguagem c wellington telles - aula 02
Linguagem c   wellington telles - aula 02Linguagem c   wellington telles - aula 02
Linguagem c wellington telles - aula 02
 
Linguagem C - Controle de Programa
Linguagem C - Controle de ProgramaLinguagem C - Controle de Programa
Linguagem C - Controle de Programa
 
Apostila de-introdução-à-linguagem-c
Apostila de-introdução-à-linguagem-cApostila de-introdução-à-linguagem-c
Apostila de-introdução-à-linguagem-c
 
Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...
 
Linguagem assembly
Linguagem assemblyLinguagem assembly
Linguagem assembly
 
Conceitos fundamentais de_programacao
Conceitos fundamentais de_programacao Conceitos fundamentais de_programacao
Conceitos fundamentais de_programacao
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Introdução à Programacao em Processing
Introdução à Programacao em Processing Introdução à Programacao em Processing
Introdução à Programacao em Processing
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Unidade04
Unidade04Unidade04
Unidade04
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducao
 
Funções em C
Funções em CFunções em C
Funções em C
 

Mais de samuelthiago

Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_vsamuelthiago
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_ivsamuelthiago
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iiisamuelthiago
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_iisamuelthiago
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_isamuelthiago
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iisamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)samuelthiago
 

Mais de samuelthiago (20)

Eclipse i (1)
Eclipse i (1)Eclipse i (1)
Eclipse i (1)
 
Html básico
Html básicoHtml básico
Html básico
 
Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_v
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_iv
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iii
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_ii
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_i
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_ii
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)
 
Java 08
Java 08Java 08
Java 08
 
Java 07
Java 07Java 07
Java 07
 
Java 06
Java 06Java 06
Java 06
 
Java 05
Java 05Java 05
Java 05
 
Java 04
Java 04Java 04
Java 04
 
Java 03
Java 03Java 03
Java 03
 
Java 02
Java 02Java 02
Java 02
 
Java 01
Java 01Java 01
Java 01
 

Pged 02

  • 1. Curso Superior de Tecnologia em Telemática Programação e Estruturas de Dados Linguagem C: Estruturas e Alocação Dinâmica Copyright©2010 Prof. César Rocha cesarocha@ifpb.edu.br 1
  • 2. Objetivos § Explorar os conceitos fundamentais acerca da alocação dinâmica de memória em C § Quando e como alocar memória, principais funções e bibliotecas da linguagem C, como acessar áreas alocadas, boas práticas de programação, quando e como liberar memória. § Apresentar os mecanismos fundamentais da linguagem C para a estruturação de tipos § Por que estruturar código, como acessar os campos de uma estrutura, uso de typedef, ponteiros para estruturas, passando estruturas para funções, boas práticas e alocação dinâmica de estruturas 2
  • 3. Estrutura de Dados I Parte I - Alocação Dinâmica de Memória 3
  • 4. Motivação § Até aqui, na declaração de um vetor, foi preciso dimensioná-lo (seja diretamente ou seja v[n] ) § Isto nos obrigava a saber, de antemão, o número máximo de elementos no vetor durante a codificação § Em alguns cenários, este pré-dimensionamento de memória é um fator muito limitante. § Imagine uma função que possa receber um vetor (de tamanho desconhecido) e tenha de criar um outro vetor de mesmo conteúdo (um clone) do original § Devo dimensionar o vetor clone com um número absurdamente alto ou ser modesto (e não prever vetores de tamanho maiores) ? 4
  • 5. Motivação § Felizmente, C oferece meios de requisitar espaços de memória em tempo de execução § Dizemos que é possível alocar memória dinamicamente § Assim, teremos programas que utilizam recursos de memória de maneira mais versátil § Só utilizam a memória quando necessário § Se adaptam aos recursos disponíveis da máquina § Todas as operações de acesso e alteração dos dados alocados dinamicamente são feitas a partir dos apontadores 5
  • 6. Conceitos § Em C, basicamente, há três formas de se alocar memória, conforme a seguir: Œ Estaticamente: uso de variáveis globais e variáveis locais estáticas declaradas dentro de funções. Estas são liberadas apenas com o término do programa • Implicitamente: uso de variáveis locais. O espaço existe apenas enquanto a função que declarou a variável está sendo executada Ž Dinamicamente: em tempo de execução, pode-se alocar um espaço de um determinado tamanho desejado. Este permanece reservado até que explicitamente seja liberado pelo programa(dor). 6
  • 7. Graficamente Alocação Esquemática da Memória Código do include <stdio.h> Programa Œ int main( int argc, i char *str; O sistema operacional aloca o printf(“%s de cliente código de máquina na memória. // Numerical results printf(“Digite o pr Variáveis globais Œ Ele reserva também os espaços necessários para armazenar as Alocação variáveis globais (e estáticas) dinâmica Ž existentes no programa. Esta área livre de memória é requisitada não somente pelas chamadas de função na pilha, mas também pelas alocações em tempo de execução. O restante da memória livre é utilizado pelas variáveis locais (na pilha) e pelos Pilha • espaços alocados dinamicamente. 7
  • 8. malloc() § malloc() é a principal função de alocação dinâmica de memória presente na stdlib.h § Ela 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. void *malloc(size_t tamanho); § Se o espaço de memória livre for menor que o espaço requisitado dinamicamente, malloc() retorna um apontador nulo (NULL) § O apontador também será utilizado quando se for fazer a liberação da área de memória alocada 8
  • 9. malloc() § Por questões de portabilidade entre compiladores, utilize o operador sizeof() em vez de atribuir manualmente o tamanho em bytes do tipo § Devemos lembrar que a função malloc é usada para alocar espaço de qualquer tipo, daí o cast explícito // Considere o código abaixo na alocação de um vetor de inteiros // Considere o código abaixo na alocação de um vetor de inteiros // de 4 células // de 4 células #include <stdlib.h> #include <stdlib.h> int main(void) { int main(void) int *v; int *v; v = (int*) malloc ( 4 * sizeof( int ) ); v = (int*) malloc ( 4 * sizeof( int ) ); v[0] = 23; … v[0] = 23; … } } 9
  • 10. Graficamente int *v; v = (int *) malloc (4*sizeof(int)) Abre-se espaço na pilha para Reserva espaço de memória na área livre e o ponteiro (variável local) atribui endereço à variável Código do Código do Programa Programa Variáveis globais Variáveis globais 0x3294 08 bytes V #@$%& V 0x3294 Pilha Pilha 10
  • 11. Tratamento de erros § É fundamental testar se a alocação teve ou não sucesso antes de usar o apontador retornado // Considere o código abaixo na alocação de um vetor de inteiros // Considere o código abaixo na alocação // de tamanho 4 // de tamanho #include <stdlib.h> #include <stdlib.h> int main(void) { int main(void) { int *v; int *v; v = (int*) malloc ( 4 * sizeof( int ) ); v = (int*) if (v==NULL) { if (v==NULL) { puts( "Memória insuficiente.n“ ); puts( return(1); // aborta o programa e retorna 1 para o SO return(1); // aborta o programa } } v[0] = 23; … v[0] = 23; … } } 11
  • 12. free() § Para liberar um espaço de memória alocado dinamicamente, usamos a função free() § Esta função recebe como parâmetro o ponteiro contendo o endereço da memória a ser liberada. void free( void *pt ); § Só podemos passar para esta função um endereço de memória que tenha sido alocado dinamicamente. § Devemos lembrar ainda que não podemos acessar o espaço na memória depois que o liberamos. § O uso de um apontador inválido passado como parâmetro para free pode derrubar o sistema. 12
  • 13. free() § Diferente de outras linguagens, é tarefa do programador liberar memória com free() // Considere o código abaixo na alocação de um vetor de inteiros // Considere o código abaixo na alocação // de tamanho 4 // de tamanho 4 #include <stdlib.h> #include <stdlib.h> int main(void) { int main(void) { int *v; int *v; v = (int*) malloc ( 4 * sizeof( int ) ); v = (int*) malloc ( 4 * sizeof( int ) if (v==NULL) { if (v==NULL) { puts( "Memória insuficiente.n“ ); puts( "Memória insuficiente.n“ return(1); // aborta o programa e retorna 1 para o SO return(1); // aborta o programa } } v[0] = 23; … v[0] = 23; … free( v ); free( v ); } } 13
  • 14. Exercícios § Utilizando-se de alocação dinâmica de memória, implemente uma função que receba como parâmetro uma cadeia de caracteres digitada pelo usuário e retorne uma cópia desta cadeia alocada dinamicamente. § O protótipo desta função pode ser dado por: char* duplica (char* s); § Imprima a cópia ao final da duplicação § A função que chama duplica ficará responsável por liberar o espaço alocado. 14
  • 15. Estrutura de Dados I Parte 2 – Estruturas 15
  • 16. Motivação § Vimos que C suporta tipos básicos (char, int, float, double, ...) vetores e ponteiros para estes tipos § Muitas vezes, na modelagem de uma entidade mais complexa do mundo real para o computacional, o programador C realiza esta tarefa apenas reunindo vários valores de tipos mais simples. § Ex: entidade livro num sistema de biblioteca /* livro 1 */ int cod; char titulo[40]; float preco; cod; titulo[40]; float preco; /* livro 2 */ int cod2; char titulo2[40]; float preco2; cod2; titulo2[40]; float preco2; Deste modo, os campos ficam dissociados e, no caso de vários livros, cabe ao programador não misturar campos de um livro com os de outro. 16
  • 17. Motivação § Para amenizar este problema, C oferece recursos para agruparmos dados § Potencializar a coesão e semântica da entidade § Programas mais fáceis e com melhor legibilidade. § A definição de uma estrutura forma um modelo para representação de um TAD (Tipo Abstrato de Dado) /* estruturação */ Biblioteca Biblioteca Catálogo Catálogo struct livro { livro { Lógica procedural Livro Livro int cod; cod; agrupada em Livro Livro Autor Autor char titulo[40]; titulo[40]; estruturas pequenas Autor Autor float preco; .. Autor Autor Livro Livro Autor Autor }; Na estrutura acima, podemos agrupar os dados básicos numa estrutura única e coesa. O programador C pode criar entidades mais próximas do mundo real. 17
  • 18. struct § Uma estrutura em C serve basicamente para agrupar diversas variáveis dentro de um único contexto. § Coleção de variáveis são referenciadas por um nome § Os membros de uma estrutura são geralmente chamados de elementos ou campos struct <identificador> { struct struct aluno { struct aluno { tipo nomeVariavel; tipo nomeVariavel; int matricula; tipo nomeVariavel; tipo nomeVariavel; char nome[40]; ... ... int idade; } variaveis estrutura; } variaveis estrutura; } aluno1, aluno2; Onde: <identificador> ou variáveis estrutura podem ser omitidos, mas nunca ambos! 18
  • 19. Acessando os campos § Os elementos de uma estrutura podem ser acessados através do operador de acesso “ponto” (.) #include <stdlib.h> struct ponto { // definição to TAD ponto que possui coordenadas float x; // coordenada X do ponto float y; // coordenada Y do ponto }; int main(void) { struct ponto p1; // declaração variável p1 do tipo ponto printf( "Digite as coordenadas do ponto( x, y ):" ); ); scanf( "%f %f", &p1.x, &p1.y ); "%f %f", &p1.x, &p1.y ); printf( "O ponto fornecido foi: (%.2f,%.2f)n", p1.x, p1.y ); "O ponto fornecido foi: (%.2f,%.2f)n", return 0; } 19
  • 20. typedef § Visando simplificar (ou abreviar) nomes de tipos e para tratarmos tipos complexos, é recomendado o uso de typedef § Por exemplo: struct ponto { { typedef struct { float x; float x; float y; float y; } } Ponto; // novo tipo Ponto; struct ponto p1; p1; Ponto p1; p1; § Vale lembrar que typedef permite nomear quaisquer outros tipos de dados (float, int, …) 20
  • 21. Ponteiros para estruturas § Da mesma forma que podemos declarar um ponteiro para uma variável comum, podemos armazenar o endereço de uma estrutura § Muito útil em passagem de estruturas para funções (veremos mais adiante) § É possível acessar os campos dessa estrutura indiretamente através deste ponteiro § Operador seta -> é utilizado para acessar os elementos de uma estrutura que foi passada como ponteiro; 21
  • 22. Ponteiros para estruturas § Exemplo: #include <stdlib.h> typedef struct { // definição TAD ponto com coordenadas float x; // coordenada X do ponto float y; // coordenada Y do ponto } Ponto; int main(void) { Ponto p1; // declaração variável p1 do tipo ponto Ponto *pt; // declaração do ponteiro para estrutura p1.x = 5; p1.y = 4; // acesso as variáveis via operador ‘.’ p2 = &p1; // faz pt apontar para endereco da estrutura = p2->x = 10; p2->y = 20 // acesso aos campos via -> printf( “Coordenadas de p1: (%.2f,%.2f)n", p1.x, p1.y ); return 0; } 22
  • 23. Resumo § Em síntese, se temos uma variável estrutura e queremos acessar seus campos, usamos o operador de acesso ponto § Se temos uma variável ponteiro para estrutura, usamos o operador de acesso seta § Finalmente e, seguindo o raciocínio, se temos uma variável ou um ponteiro e queremos acessar o endereço de um campo, fazemos & § Ex: scanf("%f %f", &var.x, &var.y); scanf("%f %f", &pt->x, &pt->y); 23
  • 24. Passando estruturas para funções § Vimos, no módulo anterior, que a passagem por parâmetros em C se dá fundamentalmente por valor § Não era possível alterar a variável original e sim apenas o parâmetro local, dentro da função § Era necessário utilizar o operador & quando queríamos passar não uma cópia, mas o endereço da variável § Porém, no caso de estruturas, considere a função: void captura (struct ponto p1) { puts( "Digite as coordenadas (x y): " ); scanf("%f %f", &p.x, &p.y); } Preste atenção nos pontos críticos! pontos críticos! 24
  • 25. Passando estruturas para funções § Existem alguns pontos críticos a serem considerados: § Copiar uma estrutura inteira para a pilha pode ser uma operação onerosa para o compilador. E se a estrutura tivesse 30 campos? § Não é possível alterar os campos da estrutura original § Altamente recomendado: § É mais conveniente passar apenas o ponteiro da estrutura, mesmo que não seja necessário alterar os valores dos elementos dentro da função O que deve ser feito para corrigir a função anterior? corrigir função anterior? 25
  • 26. Passando estruturas para funções § Exemplo: void captura (struct ponto* pt) { printf("Digite as coordenadas do ponto(x y): "); scanf("%f %f", &pt->x, &pt->y); } void imprime (struct ponto* pt) { printf("O ponto fornecido: (%.2f,%.2f)n", pt->x, pt->y); } // função principal int main(void) { struct ponto p; captura(&p); imprime(&p); return 0; } 26
  • 27. Alocação dinâmica de estruturas § Da mesma forma que fizemos com vetores, as estruturas podem ser alocadas dinamicamente: #include <stdlib.h> typedef struct { // definição TAD ponto com coordenadas float x; // coordenada X do ponto float y; // coordenada Y do ponto } Ponto; int main(void) { Ponto *pt; // declaração do ponteiro para estrutura pt = ( Ponto* ) malloc ( sizeof ( Ponto ) ); Ponto ) ); if (pt==NULL) { puts( "Memória insuficiente.n“ ); return 1; // aborta o programa e retorna 1 para o SO } pt->x = 42; … pt->x free(pt); 27
  • 28. Exercícios § (Para profissionais!) Escreva uma função que tenha como valor de retorno a distância entre dois pontos. § O protótipo da função final pode ser dado por: float distancia( struct Ponto *p1, struct Ponto *p2 ); § Primeiro, crie os dois pontos (duas estruturas) alocados dinamicamente em memória. Depois, calcule a distância entre os pontos com base na fórmula abaixo: d = ( x 2 - x1) 2 + ( y 2 - y1) 2 § A função que chama distancia ficará responsável por imprimir o resultado e liberar o espaço alocado 28
  • 29. Para um bom aproveitamento: § Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas § Resolva todas as questões da lista de alocação dinâmica e estruturas § Procure o professor ou monitor da disciplina e questione conceitos, listas, etc. § Não deixe para codificar tudo e acumular assunto para a primeira avaliação. § Este é apenas um dos assuntos abordados na prova! 29