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