Aula 08: - Mapa de memória de um processo

Propaganda
MCTA028 – Programação Estruturada
Aula 08:
- Mapa de memória de um processo
- Ponteiros (parte 1)
Prof. Jesús P. Mena-Chalco
[email protected]
3Q-2016
1
Mapa de memória de um processo
2
Alocação de memória: estática VS Dinâmica
Na execução, um programa é um processo.
Um processo ocupa parte da memória principal,
reservada para:
As instruções, e
A pilha
3
Processo na memória
INSTRUÇÕES
PILHA (STACK)
Armazena o
código
compilado
(na linguagem
máquina)
Armazena as variáveis
ao longo da execução
do programa.
[~bytes]
[~Mbytes]
Tamanho limitado
4
Processo na memória
INSTRUÇÕES
PILHA (STACK)
HEAP
Armazena o
código
compilado
(na linguagem
máquina)
Armazena as variáveis
ao longo da execução
do programa.
Espaço de memória principal
gerenciado pelo SO.
[~bytes]
[~Mbytes]
[~Toda a memória RAM]
Tamanho limitado
5
Processo na memória
INSTRUÇÕES
PILHA (STACK)
Armazena o
código
compilado
(na linguagem
máquina)
Armazena as variáveis
ao longo da execução
do programa.
Espaço de memória principal
gerenciado pelo SO.
[~bytes]
[~Mbytes]
[~Toda a memória RAM]
Alocação estática
int x;
double M[10][20];
char *c;
HEAP
Alocação dinâmica
double M = malloc(...);
6
Maior elemento em um vetor (aula anterior)
← Alocação estática
← Alocação dinâmica
← Alocação estática
7
Fenômeno: Stack Overflow
Processo na memória
INSTRUÇÕES
PILHA (STACK)
HEAP
8
Ponteiros?
Processo na memória
INSTRUÇÕES
PILHA (STACK)
HEAP
Em Java e Python o uso é transparente.
Não precisa se preocupar de alocar e
liberar memória
9
Ponteiros
10
Vetores e ponteiros
...
vetor
...
11
Vetores e ponteiros
...
...
12
Endereços e ponteiros
(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.
13
Endereços e ponteiros
Os conceitos de endereço e ponteiro são fundamentais
em qualquer linguagem de programação.
Na linguagem C é mais visível este conceito.
Requer um esforço para usar os ponteiros.
(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.
14
Endereços
A memória de qualquer computador (arquitetura de von
Neumann) é uma sequência de bytes.
Cada byte armazena um de 256 possíveis valores
Os bytes são numerados sequencialmente e o número de um
byte é o seu endereço
(*) Fonte: http://codingfox.com/3-1-computer-memory-and-data-representation/
15
Endereços
...
0x37FD00
01010111
0x37FD01
11000011
0x37FD02
01100100
0x37FD03
11100010
...
16
Endereços
...
0x37FD00
01010111
0x37FD01
11000011
0x37FD02
01100100
0x37FD03
11100010
...
Cada objeto na memória do computador tem um endereço.
17
Endereços
...
37FD00
01010111
37FD01
11000011
37FD02
01100100
37FD03
11100010
...
Geralmente o endereço do objeto é o endereço do 1ro byte.
18
Endereços
Em c o endereço de um objeto é dado pelo operador &
Se x é uma variável, então &x é o seu endereço
int s = ­999
s
-9999
0x89422
19
Endereços
Em c o endereço de um objeto é dado pelo operador &
Se x é uma variável, então &x é o seu endereço
int s = ­999
int *p = &s
p
s
0x89422
-9999
0x60001
0x89422
p = 0x89422
&p = 0x60001
*p = -9999
“p aponta para a s”
“p é o endereço de s”
“p aponta a s”
*p é o mesmo que escrever “s”
20
Endereços
4
8
21
Endereços
Todo ponteiro pode ter o valor NULL.
NULL é uma constante, geralmente vale 0
(definida no arquivo interface stdlib)
int *p = NULL;
p
0x00000
0
0x564320
22
Endereços
Há vários tipos de ponteiros:
P. para caracteres
P. para inteiros
P. para registros
P. para ponteiros para inteiros
int* p ;
← Um tipo de dado novo int* (conceitualmente correto)
int *p;
← O “*” modifica a variável e não o int (mais aceito)
int * p;
O compilador C aceita
qualquer das formas.
23
exemploPonteiro.c
Operadores unarios
& → Referência: na frente de uma variável:
Devolve o endereço de memória onde a variável está armazenada
* → Derreferência: na frente de variável ou expressão:
Devolve o valor ou conteúdo do endereço de memória apontada
pela variável ou expressão
24
exemploPonteiro.c
25
exemploPonteiro2.c
26
exemploPonteiro3.c
27
exemploPonteiro3.c
28
exemploPonteiro3.c
Por que o código abaixo está errado?
29
Vetores e endereços
30
Vetores
Os elementos de um vetor são alocados consecutivamente na
memória do computador.
Se cada elemento ocupa b bytes, a
diferença entre os endereços de dois
elementos consecutivos será de b.
(ex. inteiros ocupam 4 bytes, em uma
plataforma de 64 bits)
31
Vetores
Os elementos de um vetor são alocados consecutivamente na
memória do computador.
Se cada elemento ocupa b bytes, a
diferença entre os endereços de dois
elementos consecutivos será de b.
O compilador C cria a ilusão de que
b vale 1 qualquer que seja o tipo dos
elementos do vetor.
32
Alocação de memória
33
Alocação de memória
Ideia
V+i*sizeof(int)
34
Alocação memória
35
Quando não for possível
Separar memoria suficiente
Um ponteiro NULO é devolvido
36
Quando não for possível
Separar memoria suficiente
Um ponteiro nulo é devolvido
A diferença de ponteiros
Devolve um long e é
Permitida se os dois forem do
Mesmo tipo
37
Os ponteiros
facilitam a
alocação dinâmica
de memória
38
Matrizes
Material adaptado da aula de Matrizes de Ronaldo F. Hashimoto e Carlos H. Morimoto (IME/USP)
39
Declara uma matriz M
de 100 linhas
com 200 colunas
(20mil inteiros)
A memória do computador é linear!
40
Estrutura da matriz na memória do computador
41
Disposição dos 20mil elementos da matriz M na memória
Qual o endereço de M[0][78]?
(tendo como base M[0][0])
42
Disposição dos 20mil elementos da matriz M na memória
Qual o endereço de M[0][78]?
(tendo como base M[0][0])
&M[0][0]+78
43
Disposição dos 20mil elementos da matriz M na memória
Qual o endereço de M[78][21]?
(tendo como base M[0][0])
44
Disposição dos 20mil elementos da matriz M na memória
Qual o endereço de M[78][21]?
(tendo como base M[0][0])
&M[0][0] + (78*200+21)
45
Índices
Na linguagem C não existe verificação de índices fora da
matriz/vetor.
Quem deve controlar o uso correto dos índices é o
programador.
O acesso utilizando um índice errado pode ocasionar o acesso
de outra variável na memória.
→ Se o acesso à memória é indevido você recebe a
mensagem “segmentation fault”.
46
Matrizes
47
Matrizes
48
49
Atividade em aula
50
Questão 1 - a
Escreva o resultado da execução do seguinte programa
51
Questão 1 - b
Escreva o resultado da execução do seguinte programa
52
Questão 1 - c
Macro!
53
Função com matriz como parâmetro
O nome de uma matriz dentro do parâmetro de uma função é
utilizado como sendo um ponteiro para o primeiro
elemento da matriz que está sendo usada na hora de utilizar
a função.
→ Não é alocada memória (novamente) para um vetor
passado por parâmetro para uma função.
54
Questão 4
Escreva um programa que leia um número inteiro positivo n seguido
de n números inteiros e imprima esses n números em ordem
invertida.
Por exemplo, ao receber
5
22 33 44 55 66
o seu programa deve imprimir
66 55 44 33 22
Seu programa não deve impor limitações sobre o valor de n
Seu programa não deve usar colchetes.
55
Questão 2
Os ponteiros
facilitam a
alocação dinâmica
de memória
56
Download