1) A alocação dinâmica de memória permite que um programa aloca memória durante a execução.
2) As funções malloc() e free() são usadas para alocar e liberar memória dinamicamente do heap.
3) A função malloc() aloca memória do heap e retorna um ponteiro void para a área alocada. A função free() libera a memória alocada anteriormente pelo malloc().
O documento discute alocação dinâmica de memória em C++. Apresenta as funções new e delete para alocar e desalocar memória no heap durante a execução do programa. Exemplifica o uso dessas funções para alocar variáveis e vetores.
O documento descreve os conceitos de alocação dinâmica de memória em C++. Explica que a memória alocada dinamicamente é obtida do heap e que os operadores new e delete são usados para alocar e liberar essa memória durante a execução do programa.
O documento descreve conceitos de alocação dinâmica de memória em C, incluindo o uso das funções malloc(), calloc(), realloc() e free(). Explica como alocar e libertar memória para estruturas e vetores, e como redimensionar blocos de memória alocados.
Estruturas em C permitem agrupar dados heterogêneos sob uma mesma estrutura. Podem conter tipos básicos, matrizes e outras estruturas. São declaradas usando a palavra-chave struct e permitem organizar e acessar dados de forma conjunta.
O documento discute os dois tipos de alocação de memória em C: alocação estática, onde o tamanho da memória é definido durante a compilação, e alocação dinâmica, onde o tamanho é definido durante a execução usando funções como malloc() e free(). A alocação dinâmica permite ajustar o tamanho de memória alocada de acordo com as necessidades do programa.
Este documento discute alocação dinâmica de memória e estruturas na linguagem C. Ele explora conceitos como quando e como alocar memória dinamicamente usando funções como malloc() e free(), e como estruturar dados usando estruturas para agrupar variáveis relacionadas. O documento também aborda tópicos como acessar campos de estruturas, typedef, ponteiros para estruturas e passar estruturas como parâmetros para funções.
O documento fornece uma introdução às principais características da linguagem C++, incluindo sua história, compilação, tipos de dados, ponteiros, referências, arrays, estruturas de controle e namespaces. É destacado que C++ é uma linguagem multi-paradigma que oferece programação procedural, orientada a objetos e metaprogramação.
O documento discute alocação dinâmica de memória em C++. Apresenta as funções new e delete para alocar e desalocar memória no heap durante a execução do programa. Exemplifica o uso dessas funções para alocar variáveis e vetores.
O documento descreve os conceitos de alocação dinâmica de memória em C++. Explica que a memória alocada dinamicamente é obtida do heap e que os operadores new e delete são usados para alocar e liberar essa memória durante a execução do programa.
O documento descreve conceitos de alocação dinâmica de memória em C, incluindo o uso das funções malloc(), calloc(), realloc() e free(). Explica como alocar e libertar memória para estruturas e vetores, e como redimensionar blocos de memória alocados.
Estruturas em C permitem agrupar dados heterogêneos sob uma mesma estrutura. Podem conter tipos básicos, matrizes e outras estruturas. São declaradas usando a palavra-chave struct e permitem organizar e acessar dados de forma conjunta.
O documento discute os dois tipos de alocação de memória em C: alocação estática, onde o tamanho da memória é definido durante a compilação, e alocação dinâmica, onde o tamanho é definido durante a execução usando funções como malloc() e free(). A alocação dinâmica permite ajustar o tamanho de memória alocada de acordo com as necessidades do programa.
Este documento discute alocação dinâmica de memória e estruturas na linguagem C. Ele explora conceitos como quando e como alocar memória dinamicamente usando funções como malloc() e free(), e como estruturar dados usando estruturas para agrupar variáveis relacionadas. O documento também aborda tópicos como acessar campos de estruturas, typedef, ponteiros para estruturas e passar estruturas como parâmetros para funções.
O documento fornece uma introdução às principais características da linguagem C++, incluindo sua história, compilação, tipos de dados, ponteiros, referências, arrays, estruturas de controle e namespaces. É destacado que C++ é uma linguagem multi-paradigma que oferece programação procedural, orientada a objetos e metaprogramação.
Este documento resume os principais comandos de controle de programa em C, incluindo estruturas condicionais como if/else e switch, e estruturas de repetição como for e while. Os exemplos mostram como implementar cada estrutura e suas funcionalidades.
O documento fornece uma introdução sobre registradores em sistemas x86, descrevendo os principais registradores de uso geral e especiais, como EAX, EBX, EIP e EFLAGS. Explica a organização dos registradores e diferenças entre as sintaxes AT&T e Intel.
O documento descreve funções e conceitos relacionados a strings em C. As principais ideias são:
1) Strings em C são armazenadas como arrays de caracteres terminados pelo caractere '\0'.
2) Funções como scanf(), gets(), puts() e printf() são usadas para entrada, saída e formatação de strings.
3) Outras funções como strcpy(), strcat() e strcmp() manipulam e comparam strings.
1. Introdução a estruturas de dados, incluindo Tipos de Dados Abstractos (TDA), ponteiros, funções e estruturas definidas pelo programador.
2. Listas lineares como listas sequenciais, ligadas, circulares e duplamente ligadas e implementações de pilhas e filas.
3. Árvores, incluindo representação, terminologia e tipos como binárias e balanceadas.
4. Ordenação com métodos como seleção, inserção, shellsort e quicksort.
5. Pesquisa com métodos sequencial, binária e em
1) O documento discute funções no PHP, introduzindo seus conceitos e sintaxe básicos.
2) É apresentado como declarar funções, passar argumentos, utilizar retornos e chamá-las.
3) Também são discutidas funções lambda, funções em arquivos externos e a utilização de uma estrutura de pastas padrão para aplicações PHP.
O documento descreve conceitos fundamentais da linguagem C, como:
1) A função principal main() é o ponto de entrada de um programa C;
2) Funções printf() e scanf() são usadas para entrada e saída de dados;
3) Variáveis em C possuem tipos como int, float e char que determinam seu tamanho e faixa de valores.
O documento discute conceitos fundamentais de PHP, incluindo:
1) Fluxo de aplicações web, configurações, bancos de dados e protocolos de comunicação.
2) Funções, como modularizar e organizar código em PHP.
3) Arrays, como grupos de itens com chaves e valores.
4) Bibliotecas matemáticas built-in e como acessar funções.
O documento discute estratégias para implementar programação paralela implícita em Python através de threads e transações. A proposta é criar unidades paralelas de forma automática ao invés de explicitamente como nos modelos atuais. Isso facilitaria a construção de programas paralelos em Python. O autor também discute pré-processamento do código para inserir conceitos como exclusividade, barreiras e transações atômicas. Há dúvidas se o foco deveria ser um novo módulo ou pré-processamento do código.
O documento discute como otimizar aplicações Node para o motor V8. Ele explica como o V8 compila código JavaScript para código de máquina nativo e como o Crankshaft e o TurboFan otimizam esse processo. O documento também lista 12 técnicas que podem prejudicar a otimização, como atribuições em argumentos, vazamentos do arguments e uso de for-in em objetos.
1. O documento descreve o desenvolvimento de algoritmos de ordenação em C#.
2. Cinco algoritmos são implementados: bubble sort, selection sort, insertion sort, merge sort e quick sort.
3. Testes unitários foram criados para cada algoritmo para validar sua funcionalidade e desempenho.
O documento explica que a memória de um computador é composta de bytes, cada um com um endereço único. Objetos na memória como variáveis e strings ocupam bytes consecutivos, e cada objeto tem seu próprio endereço. Alocação dinâmica de memória permite reservar espaços de tamanho variável usando funções como malloc() e free().
O documento discute conceitos de programação como variáveis dinâmicas, abstração e recursividade. Ele introduz tópicos como sistemas analógicos versus digitais, computadores, software, linguagens de programação e compiladores. Também explica variáveis dinâmicas versus estáticas, alocação dinâmica de memória, estruturas de dados dinâmicas e ponteiros. Por fim, aborda abstração, tipos abstratos de dados, interfaces, classes e métodos abstratos.
1. O documento discute tópicos sobre concorrência e paralelismo em Java, incluindo criação e controle de threads, acesso exclusivo, ciclo de vida de aplicações, variáveis atômicas e travas.
2. É introduzido o framework Fork/Join, que permite paralelizar tarefas recursivas usando a estratégia "dividir para conquistar" em CPUs multi-core.
3. São explicados conceitos como work stealing, onde threads roubam tarefas de outras filas para executar, melhorando a performance.
O documento discute recursividade, definindo-a como uma solução computacional que utiliza uma função que chama a si mesma repetidamente. Apresenta exemplos como fatorial e Fibonacci e compara abordagens recursivas versus iterativas. Por fim, desafia os alunos a resolverem o problema da Torre de Hanói recursivamente.
1. O programa recebe como entrada as coordenadas de três pontos que formam um triângulo e calcula o perímetro do triângulo.
2. O perímetro é calculado somando as distâncias entre os pares de pontos, utilizando a fórmula da distância euclidiana para cada par de pontos.
3. Os resultados são mostrados na tela dentro de uma moldura.
Este documento discute alocação dinâmica em linguagem C. Ele explica que alocação dinâmica é usada quando a quantidade de memória necessária só é conhecida em tempo de execução. As funções malloc, calloc, realloc e free são usadas para alocar, inicializar e desalocar memória dinamicamente. O documento também mostra como alocar vetores e matrizes dinamicamente usando essas funções.
O documento discute funções em programação C, incluindo introdução a funções, definição de funções, protótipos de funções, conversão de tipos, chamada por valor e referência, e tipo de funções. Ele fornece exemplos e dicas sobre o uso correto de funções em C.
Apresentação trilha python do The Developers Conference 2016 em Florianópolis.
Uma introdução à biblioteca Numba (http://numba.pydata.org/) mostrando os prós e contras da biblioteca.
A vulnerabilidade de buffer overflow na aplicação Easy RM to MP3 Converter permite sobrescrever o registro EIP. Após determinar o tamanho exato do buffer, o palestrante mostra como direcionar o fluxo de execução para seu código malicioso ("shellcode") colocado na pilha. Ele então explica como encontrar um local seguro na memória para armazenar o shellcode e faz com que o EIP pule para lá através do opcode "jmp esp".
A aula aborda recursividade e apresenta exemplos de funções recursivas para calcular fatorial e potenciação. O professor também propõe exercícios para encontrar o maior elemento de um vetor e somar os elementos de um vetor usando recursividade.
Aula sobre Brainstorming 07.09.2022.pptxssuserd654cb1
1) O documento apresenta o método de melhoria de resultados (MMR) e suas etapas, incluindo identificação de problemas, causas raízes e elaboração de planos de melhoria.
2) As etapas do MMR incluem conhecer o problema, quebrar o problema, identificar causas, elaborar planos de melhoria, implementar planos e acompanhar resultados.
3) A identificação de causas envolve brainstorming, priorização e mapeamento das causas raízes dos problemas escolhidos.
O documento discute diferentes tipos de listas encadeadas, incluindo:
1) Pilhas encadeadas e filas encadeadas, que estendem a estrutura de lista encadeada para implementar pilhas e filas;
2) Listas duplamente encadeadas, que permitem navegação bidirecional através dos elementos da lista.
Mais conteúdo relacionado
Semelhante a Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
Este documento resume os principais comandos de controle de programa em C, incluindo estruturas condicionais como if/else e switch, e estruturas de repetição como for e while. Os exemplos mostram como implementar cada estrutura e suas funcionalidades.
O documento fornece uma introdução sobre registradores em sistemas x86, descrevendo os principais registradores de uso geral e especiais, como EAX, EBX, EIP e EFLAGS. Explica a organização dos registradores e diferenças entre as sintaxes AT&T e Intel.
O documento descreve funções e conceitos relacionados a strings em C. As principais ideias são:
1) Strings em C são armazenadas como arrays de caracteres terminados pelo caractere '\0'.
2) Funções como scanf(), gets(), puts() e printf() são usadas para entrada, saída e formatação de strings.
3) Outras funções como strcpy(), strcat() e strcmp() manipulam e comparam strings.
1. Introdução a estruturas de dados, incluindo Tipos de Dados Abstractos (TDA), ponteiros, funções e estruturas definidas pelo programador.
2. Listas lineares como listas sequenciais, ligadas, circulares e duplamente ligadas e implementações de pilhas e filas.
3. Árvores, incluindo representação, terminologia e tipos como binárias e balanceadas.
4. Ordenação com métodos como seleção, inserção, shellsort e quicksort.
5. Pesquisa com métodos sequencial, binária e em
1) O documento discute funções no PHP, introduzindo seus conceitos e sintaxe básicos.
2) É apresentado como declarar funções, passar argumentos, utilizar retornos e chamá-las.
3) Também são discutidas funções lambda, funções em arquivos externos e a utilização de uma estrutura de pastas padrão para aplicações PHP.
O documento descreve conceitos fundamentais da linguagem C, como:
1) A função principal main() é o ponto de entrada de um programa C;
2) Funções printf() e scanf() são usadas para entrada e saída de dados;
3) Variáveis em C possuem tipos como int, float e char que determinam seu tamanho e faixa de valores.
O documento discute conceitos fundamentais de PHP, incluindo:
1) Fluxo de aplicações web, configurações, bancos de dados e protocolos de comunicação.
2) Funções, como modularizar e organizar código em PHP.
3) Arrays, como grupos de itens com chaves e valores.
4) Bibliotecas matemáticas built-in e como acessar funções.
O documento discute estratégias para implementar programação paralela implícita em Python através de threads e transações. A proposta é criar unidades paralelas de forma automática ao invés de explicitamente como nos modelos atuais. Isso facilitaria a construção de programas paralelos em Python. O autor também discute pré-processamento do código para inserir conceitos como exclusividade, barreiras e transações atômicas. Há dúvidas se o foco deveria ser um novo módulo ou pré-processamento do código.
O documento discute como otimizar aplicações Node para o motor V8. Ele explica como o V8 compila código JavaScript para código de máquina nativo e como o Crankshaft e o TurboFan otimizam esse processo. O documento também lista 12 técnicas que podem prejudicar a otimização, como atribuições em argumentos, vazamentos do arguments e uso de for-in em objetos.
1. O documento descreve o desenvolvimento de algoritmos de ordenação em C#.
2. Cinco algoritmos são implementados: bubble sort, selection sort, insertion sort, merge sort e quick sort.
3. Testes unitários foram criados para cada algoritmo para validar sua funcionalidade e desempenho.
O documento explica que a memória de um computador é composta de bytes, cada um com um endereço único. Objetos na memória como variáveis e strings ocupam bytes consecutivos, e cada objeto tem seu próprio endereço. Alocação dinâmica de memória permite reservar espaços de tamanho variável usando funções como malloc() e free().
O documento discute conceitos de programação como variáveis dinâmicas, abstração e recursividade. Ele introduz tópicos como sistemas analógicos versus digitais, computadores, software, linguagens de programação e compiladores. Também explica variáveis dinâmicas versus estáticas, alocação dinâmica de memória, estruturas de dados dinâmicas e ponteiros. Por fim, aborda abstração, tipos abstratos de dados, interfaces, classes e métodos abstratos.
1. O documento discute tópicos sobre concorrência e paralelismo em Java, incluindo criação e controle de threads, acesso exclusivo, ciclo de vida de aplicações, variáveis atômicas e travas.
2. É introduzido o framework Fork/Join, que permite paralelizar tarefas recursivas usando a estratégia "dividir para conquistar" em CPUs multi-core.
3. São explicados conceitos como work stealing, onde threads roubam tarefas de outras filas para executar, melhorando a performance.
O documento discute recursividade, definindo-a como uma solução computacional que utiliza uma função que chama a si mesma repetidamente. Apresenta exemplos como fatorial e Fibonacci e compara abordagens recursivas versus iterativas. Por fim, desafia os alunos a resolverem o problema da Torre de Hanói recursivamente.
1. O programa recebe como entrada as coordenadas de três pontos que formam um triângulo e calcula o perímetro do triângulo.
2. O perímetro é calculado somando as distâncias entre os pares de pontos, utilizando a fórmula da distância euclidiana para cada par de pontos.
3. Os resultados são mostrados na tela dentro de uma moldura.
Este documento discute alocação dinâmica em linguagem C. Ele explica que alocação dinâmica é usada quando a quantidade de memória necessária só é conhecida em tempo de execução. As funções malloc, calloc, realloc e free são usadas para alocar, inicializar e desalocar memória dinamicamente. O documento também mostra como alocar vetores e matrizes dinamicamente usando essas funções.
O documento discute funções em programação C, incluindo introdução a funções, definição de funções, protótipos de funções, conversão de tipos, chamada por valor e referência, e tipo de funções. Ele fornece exemplos e dicas sobre o uso correto de funções em C.
Apresentação trilha python do The Developers Conference 2016 em Florianópolis.
Uma introdução à biblioteca Numba (http://numba.pydata.org/) mostrando os prós e contras da biblioteca.
A vulnerabilidade de buffer overflow na aplicação Easy RM to MP3 Converter permite sobrescrever o registro EIP. Após determinar o tamanho exato do buffer, o palestrante mostra como direcionar o fluxo de execução para seu código malicioso ("shellcode") colocado na pilha. Ele então explica como encontrar um local seguro na memória para armazenar o shellcode e faz com que o EIP pule para lá através do opcode "jmp esp".
A aula aborda recursividade e apresenta exemplos de funções recursivas para calcular fatorial e potenciação. O professor também propõe exercícios para encontrar o maior elemento de um vetor e somar os elementos de um vetor usando recursividade.
Semelhante a Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt (20)
Aula sobre Brainstorming 07.09.2022.pptxssuserd654cb1
1) O documento apresenta o método de melhoria de resultados (MMR) e suas etapas, incluindo identificação de problemas, causas raízes e elaboração de planos de melhoria.
2) As etapas do MMR incluem conhecer o problema, quebrar o problema, identificar causas, elaborar planos de melhoria, implementar planos e acompanhar resultados.
3) A identificação de causas envolve brainstorming, priorização e mapeamento das causas raízes dos problemas escolhidos.
O documento discute diferentes tipos de listas encadeadas, incluindo:
1) Pilhas encadeadas e filas encadeadas, que estendem a estrutura de lista encadeada para implementar pilhas e filas;
2) Listas duplamente encadeadas, que permitem navegação bidirecional através dos elementos da lista.
Listas circulares são úteis para:
1) Modelar rotas circulares como rotas aéreas volta-ao-mundo
2) Escalonamento de processos em sistemas operacionais usando o método round-robin
3) Escalonamento de impressoras em sistemas de impressão controlando várias impressoras em uma fila única
1) O documento discute alocação dinâmica de memória em C usando as funções malloc() e free();
2) malloc() aloca memória no heap de forma dinâmica durante a execução do programa e retorna um ponteiro para essa área, enquanto free() libera a memória alocada anteriormente;
3) A alocação dinâmica permite que programas C alocam memória de forma flexível de acordo com as necessidades em tempo de execução.
O documento descreve os conceitos básicos de listas e como modelar listas utilizando vetores em programação estruturada. As principais ideias apresentadas são:
1) Uma lista é um conjunto de dados ordenados ou não, que podem ocupar espaços de memória contíguos ou não;
2) Listas podem ser modeladas usando vetores, necessitando de um indicador do último elemento e tratamento para quando a lista está cheia;
3) São apresentados algoritmos básicos como adicionar, remover, verificar se a lista está cheia/vazia
O documento discute listas encadeadas, pilhas encadeadas, filas encadeadas e listas duplamente encadeadas. Ele explica como cada estrutura de dados funciona, como são representadas e quais operações podem ser realizadas nelas.
Este documento discute a complexidade de algoritmos e como analisá-la. Explica que a complexidade de tempo de um algoritmo é expressa como uma função do tamanho do problema e que a notação Big-O é usada para descrever o comportamento assintótico predominante. Também apresenta exemplos como ordenação de vetores e mostra que algoritmos para o mesmo problema podem ter diferentes complexidades de tempo.
O documento discute a complexidade de algoritmos e como analisá-la. Explica que a complexidade é medida pelo tempo de execução em função do tamanho do problema e apresenta exemplos de algoritmos com diferentes complexidades como constante, linear, quadrática e cúbica. Também apresenta regras para calcular a complexidade de algoritmos como laços aninhados e instruções consecutivas.
O documento apresenta os conceitos básicos de listas e como modelá-las utilizando vetores em programação estruturada. Descreve listas como uma estrutura de dados que armazena elementos em uma sequência e apresenta algoritmos para adicionar, remover e acessar itens na lista.
Este documento apresenta os objetivos, metodologia, avaliação e programa da disciplina de Estruturas de Dados. Os principais pontos são:
1) O objetivo é ensinar técnicas de organização de dados e manipulação de estruturas de dados usando programação;
2) As aulas serão teóricas e práticas alternadas para aplicação imediata dos conceitos;
3) A avaliação inclui trabalhos, testes e projetos de implementação individual e em grupo.
O documento descreve estruturas de dados básicas utilizando vetores, especificamente pilhas e filas. Ele define estruturas de dados, discute seus aspectos estruturais e funcionais, e fornece exemplos de algoritmos para implementar pilhas e filas usando vetores, incluindo operações como empilhar, desempilhar, incluir e retirar.
A linguagem C# aproveita conceitos de muitas outras linguagens,
mas especialmente de C++ e Java. Sua sintaxe é relativamente fácil, o que
diminui o tempo de aprendizado. Todos os programas desenvolvidos devem
ser compilados, gerando um arquivo com a extensão DLL ou EXE. Isso torna a
execução dos programas mais rápida se comparados com as linguagens de
script (VBScript , JavaScript) que atualmente utilizamos na internet
As classes de modelagem podem ser comparadas a moldes ou
formas que definem as características e os comportamentos dos
objetos criados a partir delas. Vale traçar um paralelo com o projeto de
um automóvel. Os engenheiros definem as medidas, a quantidade de
portas, a potência do motor, a localização do estepe, dentre outras
descrições necessárias para a fabricação de um veículo
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...Faga1939
Este artigo tem por objetivo apresentar como ocorreu a evolução do consumo e da produção de energia desde a pré-história até os tempos atuais, bem como propor o futuro da energia requerido para o mundo. Da pré-história até o século XVIII predominou o uso de fontes renováveis de energia como a madeira, o vento e a energia hidráulica. Do século XVIII até a era contemporânea, os combustíveis fósseis predominaram com o carvão e o petróleo, mas seu uso chegará ao fim provavelmente a partir do século XXI para evitar a mudança climática catastrófica global resultante de sua utilização ao emitir gases do efeito estufa responsáveis pelo aquecimento global. Com o fim da era dos combustíveis fósseis virá a era das fontes renováveis de energia quando prevalecerá a utilização da energia hidrelétrica, energia solar, energia eólica, energia das marés, energia das ondas, energia geotérmica, energia da biomassa e energia do hidrogênio. Não existem dúvidas de que as atividades humanas sobre a Terra provocam alterações no meio ambiente em que vivemos. Muitos destes impactos ambientais são provenientes da geração, manuseio e uso da energia com o uso de combustíveis fósseis. A principal razão para a existência desses impactos ambientais reside no fato de que o consumo mundial de energia primária proveniente de fontes não renováveis (petróleo, carvão, gás natural e nuclear) corresponde a aproximadamente 88% do total, cabendo apenas 12% às fontes renováveis. Independentemente das várias soluções que venham a ser adotadas para eliminar ou mitigar as causas do efeito estufa, a mais importante ação é, sem dúvidas, a adoção de medidas que contribuam para a eliminação ou redução do consumo de combustíveis fósseis na produção de energia, bem como para seu uso mais eficiente nos transportes, na indústria, na agropecuária e nas cidades (residências e comércio), haja vista que o uso e a produção de energia são responsáveis por 57% dos gases de estufa emitidos pela atividade humana. Neste sentido, é imprescindível a implantação de um sistema de energia sustentável no mundo. Em um sistema de energia sustentável, a matriz energética mundial só deveria contar com fontes de energia limpa e renováveis (hidroelétrica, solar, eólica, hidrogênio, geotérmica, das marés, das ondas e biomassa), não devendo contar, portanto, com o uso dos combustíveis fósseis (petróleo, carvão e gás natural).
Em um mundo cada vez mais digital, a segurança da informação tornou-se essencial para proteger dados pessoais e empresariais contra ameaças cibernéticas. Nesta apresentação, abordaremos os principais conceitos e práticas de segurança digital, incluindo o reconhecimento de ameaças comuns, como malware e phishing, e a implementação de medidas de proteção e mitigação para vazamento de senhas.
2. As Funções de Alocação Dinâmica de
Memória em "C"
• Alocação Dinâmica é um meio pelo qual o
programa pode obter memória enquanto está
em execução.
• Já visto até agora:
– Constantes são "codificadas" dentro do código
objeto de um programa em tempo de compilação.
– Variáveis globais (estáticas) têm a sua alocação
codificada em tempo de compilação e são
alocadas logo que um programa inicia a execução.
– Variáveis locais em funções (ou métodos) são
alocadas através da requisição de espaço na pilha
(stack).
3. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
P
r
o
g
r
a
m
a
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
4. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
5. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
6. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
7. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
8. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
&func_B-#2
local1
local2
9. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
&func_B-#2
local1
local2
10. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
11. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
&func_B-#3
local1
local2
12. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
&func_B-#3
local1
local2
13. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
&main-#3
localA
localB
14. a
b
10010101...
"Essa aula é ...
"Será mesmo..
Sistema Operacional
HeapPointer
Início da Área
Alocável
StackPointer
Início da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
#include <stdio.h>
char *a, *b;
int func_A () {
int local1, local2;
…
}
void func_B () {
int localA, localB;
localA = func_A();
localB = func_A();
}
main () {
a = "Essa aula é legal";
b = "Será mesmo?"
func_B();
}
15. Alocação Dinâmica em "C"
• A memória alocada pelas funções de
alocação dinâmica é obtida do heap.
– O heap é a região de memória livre que se
encontra entre o programa (com a área de
armazenamento permanente) e a pilha (stack).
– O tamanho do heap é, a princípio, desconhecido
do programa.
• "C" possui duas funções básicas para
gerência de memória:
– malloc(nº de bytes) - aloca memória.
– free(endereço) - libera memória.
16. Função malloc()
• Protótipo:
void *malloc(size_t número_de_bytes);
• Detalhes:
– devolve um ponteiro do tipo void (sem tipo) para o início (1º
byte) da área de memória alocada;
– isto significa que o valor deste ponteiro pode ser atribuído a
qualquer variável do tipo ponteiro.
• Para isto deve ser utilizado sempre um typecasting.
Ex.: se x é um ponteiro para inteiro, então:
x = (int *) malloc( sizeof(int) );
– número_de_bytes é a quantidade de bytes alocada;
– se a memória for alocada no topo do heap, o heapPointer é
atualizado (incrementado de número_de_bytes);
– o tipo size_t é definido em stdlib.h.
17. #include <stdlib.h>
#include <stdio.h>
char *p;
int *q;
main() {
// Aloca 1000 bytes de RAM.
p = (char *) malloc(1000);
// Aloca espaço para 50
// inteiros.
q = (int *)
malloc(50*sizeof(int));
}
Sist.Operacional
10010101...
p
q
HeapPointer
Topo da Área
Alocável
StackPointer
Topo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
1000 bytes
50*int = 200 bytes
18. • malloc devolve:
• um ponteiro para a área alocada;
• o ponteiro nulo (NULL) caso não
seja possível alocar a memória
requisitada.
• Convém verificar se foi possível alocar
a memória.
#include <stdio.h>
#include <stdlib.h>
char *p;
main() {
................
// Tenta alocar 1000 bytes de
// RAM.
p = malloc(1000);
// Testa se p é igual a
// NULL.
if (p == NULL)
printf(“%s”, "Sem memória!");
}
Sist.Operacional
"Sem memória"
10010101...
p
HeapPointer
Topo da Área
Alocável
StackPointer
Topo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
Já alocado antes
Espaço de variáveis
locais alocado
19. Função free()
• Protótipo:
void free( void *p );
• Detalhes:
– devolve memória previamente alocada ao sistema;
– a memória devolvida é aquela que foi alocada com um
ponteiro com o valor de p:
• o valor de p deve ser um valor que foi alguma vez retornado por
malloc();
• não é possível alocar um vetor enorme e depois desalocar a
parte dele que "sobrou“;
– a utilização de free() com um valor de ponteiro qualquer
poder ter resultados catastróficos;
– a gerência de buracos no heap é responsabilidade do
sistema operacional.
20. Exercício:
Lista com um vetor de Ponteiros para Strings
• Uma lista ordenada pode conter Strings de qualquer
comprimento < 10000;
• esta lista tem um número de elementos máximo fixo (100) e é
implementada como um vetor de ponteiros para Strings;
– utilize as rotinas de lista com vetor que você implementou
para a agenda.
• Um novo String é lido primeiramente para dentro de uma
variável auxiliar qualquer;
– então é alocada memória para exatamente o seu tamanho e
ele é copiado para esta área. Para copiar um String utilize
strcpy();
– por fim um lugar na lista é encontrado para ele. A posição
escolhida do vetor de ponteiros da lista é instanciada através
da atualização dos valores do ponteiro da posição do String
na lista com o endereço do string.
21. Modelagem da estrutura
1
Lista com
Vetor de
Ponteiros
Strings lidos
do usuário
e alocados
no Heap
S a b ã o 0
C o n s t i t u i r 0
22. Modelagem da Lista
• Pseudo-código:
constantes MAXLISTA = 100;
tipo tLista {
// Vetor de ponteiros para caracter.
caracter *dados[MAXLISTA];
inteiro último;
};
• Importante: observe que criando uma variável do tipo tLista você
não vai estar alocando memória para os strings a serem lidos,
apenas para os ponteiros para eles.
23. Organização de
memória para o
exercício
Sist.Operacional
10010101...
HeapPointer
Topo da Área
Alocável
StackPointer
Topo da Pilha
Topo da Memória
Base da Memória
Código objeto
Constantes
str4
str3
str2
str1
Espaço de variáveis
locais alocado
Var.Estáticas
24. • Para verificar o comprimento de um String:
– utilize a função strlen();
– esta função devolve o comprimento (em caracteres imprimíveis) de
um string.
– Protótipo: int strlen(char *p);
#include <stdio.h>
#include <stdlib.h>
#include <sting.h>
char p[90] = "Carro";
main() {
printf("%i", strlen(p));
}
• Imprime: 5
25. • Para copiar um String:
– utilize a função strcpy();
– esta função copia o conteúdo de um string (dado por um apontador)
para a posição de memória dada por outro apontador.
– Protótipo: char *strcpy(char *destino, char *fonte);
#include <stdio.h>
#include <stdlib.h>
#include <sting.h>
char p[90] = "Carro";
char lata[20];
main() {
strcpy(lata, p));
printf("s%", lata);
}
• Imprime: Carro
26. Detalhes:
Lista Ordenada com um vetor de ponteiros para Strings
• Como você não sabe o comprimento do String que o
usuário vai digitar, use primeiro uma variável auxiliar
grande (10000 posições) para guardar o que foi
digitado;
• a lista deve ser passada como parâmetro para todas
as funções que a utilizam, bem como as variáveis de
controle da lista;
• todas as funções de lista ordenada implementadas
anteriormente devem ser reimplementadas para
utilizar estes Strings;
• para a leitura de um String utilize scanf("%s",
entrada).
27. Exercício 2:
Trabalho com Passagem de Parâmetros
• Agora você vai fazer um programa que manipula mais de uma
lista;
• o programa fará isto com um único conjunto de funções e
passagem das diversas listas como parâmetros;
• como aplicação imaginemos um sistema de contabilidade
simples;
• você vai ter um Plano de Contas constituído por duas listas:
débitos e créditos;
• o mesmo conjunto de funções (que você já implementou) vai
poder ser utilizado para isso: você somente precisa ampliar o
conjunto de parâmetros da função para passar por referência
também a lista que você quer alterar.
– A passagem de parâmetro da lista deve ser por referência porque
você deseja que as alterações sejam persistentes.
28. Modelagem de um Lançamento
• Cada lista de débitos ou créditos é constituída
por lançamentos. Cada lançamento possui:
– um valor real (positivo);
– um nome. Por exemplo, “Pagar proteção à Mafia”
• Estrutura:
tipo tLançamento {
caracter *nome;
real valor;
};
29. Modelagem de um tipo Lista para
Débitos ou Créditos
• Pseudo-código:
constantes MAXLISTA = 100;
tipo tListaContábil {
tLançamento dados[MAXLISTA];
inteiro último;
};
• Importante: observe que criando um vetor de
lançamentos, você não vai estar reservando memória
para os nomes destes, pois o campo nome é só um
ponteiro.
30. Usando (pseudo-código)
• Crie variáveis globais:
tListaContábil débitos, créditos;
• Passe estas variáveis como parâmetros por
referência:
adiciona(&débitos, nomeLanc, valorLanc);
• Cabeçalho:
Inteiro FUNÇÃO adiciona(tListaContábil *plano;
caracter *nome;
real valor);
• Importante: nome é passado como ponteiro para
caracter. Use um buffer global para ler o nome do
lançamento do usuário.
31. Modelagem da estrutura
1
Lista de débitos ou
de créditos com Vetor
de Estruturas do tipo
Lançamento
Strings lidos
do usuário
e alocados
no Heap
S a b ã o 0
P a s s a g e n s 0
R$ 5,00
R$ 505,00
32. Usando (código “C”)
• Referencie diferentemente se estiver usando
ponteiros para a lista ou a lista diretamente:
tListaContabil debitos, creditos;
debitos.dados[2].valor = 5.0;
strcpy(debitos.dados[2].nome, buffer);
Dentro das funções:
Suponha: tListaContabil *ponteiro
e ponteiro = &debitos;
ponteiro->dados[2].valor = 5.0;
strcpy(ponteiro->dados[2].nome, buffer);
33. Headerfile: como garantir Inclusão Única
// Arquivo: pilha.h
#ifndef EstruturaDaPilha
#define EstruturaDaPilha
// Definir uma estrutura para a pilha.
struct estruturaDaPilha {
int topo;
int dados[MAXPILHA];
};
// Define um tipo que tem a estrutura da
// pilha.
typedef struct estruturaDaPilha pilha;
#endif
34. Headerfiles: Importante
• A diretiva de compilação #ifndef (if not defined) diz que aquela
área de código fonte entre o #ifndef e o #endif somente será
levada em conta pelo compilador se o argumento de #ifndef
ainda não houver sido definido na mesma sessão de compilação
no escopo de um módulo;
• isso garante que código que a gente "por via das dúvidas" inclui
mais de uma vez em um módulo não seja considerado duas
vezes;
• um exemplo de como isto é útil está na diretiva #include
<stdio.h> que está presente tanto em pilha.h quanto em pilha.c e
em aplic.c;
• como aplic.c carrega pilha.h "para dentro" de si mesmo,
carregará também stdio.h. Como está explicitamente também
carregando stdio.h, se não houver uma diretiva #ifndef em
stdio.h, ele terá o mesmo código existente em stdio.h duas
vezes.
35. Módulo: lista.h
#ifndef Lista
#define Lista
typedef struct estruLista {
char *elemento[30];
int ultimo;
int max;
};
typedef struct estruLista lista;
#endif
36. Módulo: lista.c
#include <stdio.h>
#include <stdlib.h>
#include “lista.h”
lista *criaLista() {
lista *nova;
nova = malloc( sizeof(lista) );
nova->max = 30;
nova->ultimo = -1;
return (nova);
}
void destroiLista(lista *morta) {
int i;
// Libera memória ocupada pelos Strings.
for (i=0; morta->ultimo; i++)
free( morta->elemento[i] );
// Libera memória da lista.
free( morta );
}
37. Exercício de Implementação 4
Implementação de um programa com número
variável de filas com vetores alocadas
dinamicamente usando o TAD lista com vetor.
Este trabalho é bem fácil porque você já implementou
praticamente tudo o que precisa. Só tem agora que modificar
um pouco a forma de gerenciar os seus dados.
Tome o TAD Fila com Vetor que você já implementou e crie um
programa para gerenciar uma lista contendo um número
variável e menor do que 20 desses TADs. Cada Fila deverá ter
no máximo 20 posições.
Para tanto adapte o TAD Lista com Vetor que você implementou
de forma que cada elemento da lista seja um tipo ponteiro para
um TAD Fila. Quando você for inserir uma nova fila, você a cria
dinamicamente, alocando memória para ela e inicializando os
seus campos de controle.