Prévia do material em texto
SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 1 Lista de exercícios 01 da disciplina Estruturas de Dados Aula-01A, Aula-01B, Aula-02 Ponteiros, Variáveis Stack e Heap dinâmicas, Dr. Memory Projeto Disponível em: https://www.dropbox.com/s/n0kh5k1cmsk7ouu/Lista01- Aluno.zip?dl=0 1) Para resolver esta lista, reveja as apresentações: Aula-01A - Ponteiros.pptx, Aula-01B - Stack e Heap.pptx e Aula-02 - DrMemory.pptx. 2) Seja o fragmento de código com a execução em seguida a. Sabendo-se que um float ocupa 4 bytes na memória e um char ocupa 1 byte, o que você esperaria do valor de sizeof(struct aluno_a)? R: 231 bytes (201+26+4) b. O tamanho da estrutura com 232 bytes é compatível com o que você esperava? R: Não, é 1 byte maior. Isso ocorre pois 1 byte fica vazio para a leitura ser mais rápida. c. Usando como base o endereço de memória 6355808, faça um desenho esquemático de como os elementos do array alunos ficam distribuídos na memória. https://www.dropbox.com/s/n0kh5k1cmsk7ouu/Lista01-Aluno.zip?dl=0 https://www.dropbox.com/s/n0kh5k1cmsk7ouu/Lista01-Aluno.zip?dl=0 SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 2 3) Seja o fragmento de código com a execução em seguida: a. Sabendo-se que um float ocupa 4 bytes na memória e um char ocupa 1 byte, o valor de sizeof(struct aluno_b) agora é compatível com a sua contagem? R: Sim, o #pragma pack(push,1) instrui o compilador a empacotar as variáveis da struct com um alinhamento específico, nesse caso nenhum byte é perdido. SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 3 b. O compilador sempre procura acomodar as variáveis na memória de forma a tornar o acesso a elas mais rápido. Em códigos de 32 bits, o alignment é em 4 bytes, na arquitetura de 64 bits, o alignment é de 8 bytes. E para tanto, é comum deixar bytes “em branco” (padding) em structs que teriam sizeof que não seriam múltiplos de 4 (código de 32 bits) ou 8 (código de 64 bits). Em suma, o programador pode considerar que o sizeof() será a contagem dos bytes de cada elemento de uma struct? R: Não, ele precisa levar em conta o alignment também, em caso da somas dos bytes das variáveis não serem múltiplos de 4(32 bits) ou 8(64 bits). 4) Seja o fragmento de código com a execução em seguida: a) Faça um desenho esquemático de como os elementos do array alunos ficam distribuídos na memória. SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 4 b) Essa função apresenta vazamento de memória, uma vez que os mallocs não foram liberados. Complemente a função trataAluno_c1() de maneira a liberar toda memória alocada. Execute o projeto a partir do Dr. Memory para garantir que nenhum erro de vazamento persista. SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 5 5) Seja o fragmento de código com a execução em seguida: SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 6 a) Faça um desenho esquemático de como os elementos do array alunos ficam distribuídos na memória. SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 7 b) Essa função apresenta vazamento de memória, uma vez que os mallocs não foram liberados. Complemente a função trataAluno_c2() de maneira a liberar toda memória alocada. Execute o projeto a partir do Dr. Memory para garantir que nenhum erro de vazamento persista. 6) Seja o fragmento de código com a execução em seguida: SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 8 a) Faça um desenho esquemático de como as variáveis ficam distribuídas na memória. b) Essa função apresenta acesso a ponteiro oscilante. Corrija a função trataAluno_a2(). Execute o projeto a partir do Dr. Memory para garantir que nenhum erro relativo à memória persista. SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 9 7) Seja o fragmento de código com a execução em seguida: a) Faça um desenho esquemático de como as variáveis ficam distribuídas na memória. SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 10 b) Essa função apresenta erro de liberação de memória. Corrija a função trataAluno_a3(). Execute o projeto a partir do Dr. Memory para garantir que nenhum erro relativo à memória persista. R: Não se pode liberar memória da Stack SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 11 8) Seja o fragmento de código com a execução em seguida: SERVIÇO PÚBLICO FEDERAL INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE SÃO PAULO CAMPUS SALTO 12 a) Por que zerar a matriz percorrendo os elementos coluna por coluna demora mais que o dobro do tempo do que quando a matriz é percorrida linha por linha? R: Por causa do princípio da localidade, quando percorremos a matriz por linha os vizinhos estarão no cache, o que torna o acesso muito mais rápido. Quando varremos a matriz por coluna o cache é resetado toda hora, pois é necessário buscar novamente na memória onde o próximo valor está armazenado e isso acaba aumentando o tempo de execução.