Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Limpando a memória _A função memset || fflush(stdin); || setbuf(stdin, NULL); _Limpar o Buffer

Limpando a memória na Linguagem C _A função memset e se usa um desse para fazer Limpeza da memória

-->>

A função memset || fflush(stdin); || setbuf(stdin, NULL);

"" Limpar o Buffer

Por gentileza, alguém pode me dizer qual das três é a melhor e para qual situação posso usa cada uma?

7 respostas

Oi Thalles,

a razão pela qual vemos o memset nesse curso é apenas para termos certeza de que o pedaço de memória que vamos usar esteja sem "lixo" -- isto é, para que saibamos que tudo o que tem nessa posição de memória são, no exemplo do curso, zeros:

memset(&variavel, 0, sizeof(SUA_STRUCT));

Isso é importante porque se esquecermos de colocar informação nessa variável, poderíamos, sem querer, usar o lixo que já estava naquela posição de memória e, com ele, ter resultados bem estranhos.

Pense, por exemplo, em um programa que guardasse a query que você faria para o banco de dados em uma variável. Você vai precisar criar essa variável e colocar nela a string da query. Aí, por um acaso, aquele pedaço de memória que você alocou tem um lixo onde vemos os caracteres kjs83khas; drop database; bem no trecho que seria usado como a query. Aí, por um novo acaso, o desenvolvedor esquece de preencher a memória com a query correta e esse trecho de lixo é rodado.

Sem querer, por uma grande coincidência e azar, poderíamos apagar todas as tabelas do banco de dados que acessamos! Para garantir que não vamos ter lixo perigoso em variáveis, usamos o memset


A função fflush é usada para forçar seu programa a escrever agora tudo o que está no buffer que você passar como parâmetro - por exemplo o da saída de dados padrão.

As linguagens usualmente criam buffers para atividades que envolvam entrada e saída de dado (IO operations) porque essas são particularmente demoradas e frequentemente bloqueiam a execução normal do programa, enquanto estão escrevendo ou lendo.

fflush(stdout);

Se você chamar esse código, tudo o que está sendo acumulado para ser escrito quando o buffer encher será escrito agora. Isso serve, por exemplo, para garantir que toda a saída do programa será impressa antes do programa terminar!

Lembrando que ele também serve para arquivos ou qualquer tipo de buffer que você estiver usando.


A função setbuf, por sua vez, simplesmente transforma esse buffer que mencionamos acima para um buffer que determinarmos no segundo parâmetro. Então, quando as pessoas querem jogar fora tudo o que está em um buffer, elas podem fazer:

 setbuf(stdout, 0);

Após essa linha, tudo o que estava no buffer foi jogado fora e, assim, o que não tinha sido impresso não o será mais. A mesma ideia vale para a leitura:

 setbuf(stdin, 0);

Esse código faria tudo o que está no buffer de leitura da entrada padrão e ainda não foi consumido, ser jogado fora. Agora, seu buffer está limpo para receber uma nova entrada de dados.

Fez sentido?

Ola Cecilia muito Obrigado pela explicação e também do exemplos a compreensão melhorou. Valeu mesmo

Achei estranho os 3 módulo na Linguagem C não fala tudo ser um curso completo. Mas gostei muito de ver como é feito na prático de um exemplos de um jogo. Será que vai ter outro Módulo na Linguagem C IV com mais prática do dia a dia. ?

Cecilia Valeu muito Obrigado

Oi Thalles,

você sentiu falta de algum assunto em especial? Não sei como está a fila prioridades de cursos, mas pedi pro pessoal que cuida disso dar uma olhada e te responder aqui, ok?

[]s

solução!

Oi Thales

A melhor forma de ter um curso de C com tópicos avançados é você fazer um sugestão aqui : bit.ly/1TjxUeV . Costumamos priorizar os mais pedidos dessa lista.

Infelizmente, no momento não temos nenhum novo curso de C em produção.

abraço

Valeu Obrigado pela Atenção

  • Caio Cesar Souza Valeu pela dica, eu fiz minha sugestão no site: bit.ly/1TjxUeV

_Sugestão: https://feedback.userreport.com/409aa4ef-3399-4f03-ba57-cb36f702a520/#idea/83619