Melhor Controle de Memória de Strings em C

Publicado por Mauricio Ferrari em 11/05/2020

[ Hits: 609 ]

Blog: http://linguagemcfacil.mozello.com/

 


Melhor Controle de Memória de Strings em C



Se você está começando a programar em C, não deixe essa dica passar. Ao fazer um curso no Udemy sobre Linguagem C e C++, aprendi uma expressão para limpar os espaços alocados não utilizados na memória.

Você irá usar a expressão após gravar uma string. Veja a expressão:

palavra[strlen(palavra)-1] = '\0';

Para testar, você pode usar esse exemplo:

#include <stdio.h>
#include <stdlib.h>

void main(){
    char exemplo[10];
    printf("Digite uma palavra com menos de 10 digitos");
    setbuf(stdin, 0);
    fgets(exemplo, 10, stdin);

    exemplo[strlen(exemplo)-1] = '\0'; /** A função para limpar os espaços vazios. **/

    printf("%s", exemplo);
    system("pause");
}

Fica aí a dica.

Outras dicas deste autor

RecordMyDesktop no Slackware Funcionando no KDE Plasma 5

EasyMP3Gain no Debian, Ubuntu e derivados

Compilando o Vim 8.2 com suporte a clipboard

Trocando o LILO pelo GRUB no Slackware

Consultando qual o repositório está ativo no slackpkg usando apenas o grep

Leitura recomendada

Programação para Arduino

Fazendo comparações sem o uso de IF, ELSE em C

Ocorrência de uma string em outra

Limpando o buffer do teclado em C

Pressionar tecla e não precisar pressionar ENTER

  

Comentários
[1] Comentário enviado por mauricio123 em 12/05/2020 - 22:02h


Fiz um conteúdo mais completo explicando nesse Link:
http://linguagemcfacil.mozello.com/conteudos/params/post/2116859/liberando-memoria-ajustando-tamanho...

___________________________________
Conhecimento não se Leva para o Túmulo.

[2] Comentário enviado por sallesricardo em 19/05/2020 - 00:22h

Mauricio, desculpe a intromissão, mas eu tenho algumas considerações a fazer.

Pra começar, nunca faça 'fgets(exemplo, 255, stdin);" a não ser que você tenha declarado a variável exemplo com tamanho 255. Do jeito que está, se o usuário digitar mais que 9 caracteres, o fgets vai colocar esses caracteres numa posição de memória não reservada para a sua variável e sobrescrever outra variável do seu programa causando resultados imprevistos na sua lógica, ou causando a falha de segmentation fault no seu programa que é gerado quando o seu programa tenta usar uma região de memória que não foi reservada para o seu programa pelo kernel do seu sistema operacional.

A função strlen retorna o tamanho da string que é a posição do caractere '\0' ou nulo. Então, se sua já tem o caractere '\0' no final dela, não há necessidade de fazer "exemplo[strlen(exemplo)-1] = '\0';", porque essa parte está colocando o caractere nulo onde já tem um caractere nulo.

Uma boa pratica para garantir que você tenha '\0' no restante do seu vetor mesmo que você não tenha certeza que a função que você esta usando já coloque o '\0' no final da string, é usando a função "memset(exemplo, '\0', 10);" da biblioteca <string.h>. A função memset recebe como parametros, 1º o vetor a ser setado, 2º o caractere que vai ser setado em todo o vetor, 3º a quantidade de vezes. No exemplo a variavel exemplo terá as 10 posições com o valor '\0'.

[3] Comentário enviado por mauricio123 em 20/05/2020 - 18:51h


[2] Comentário enviado por sallesricardo em 19/05/2020 - 00:22h

Mauricio, desculpe a intromissão, mas eu tenho algumas considerações a fazer.

Pra começar, nunca faça 'fgets(exemplo, 255, stdin);" a não ser que você tenha declarado a variável exemplo com tamanho 255. Do jeito que está, se o usuário digitar mais que 9 caracteres, o fgets vai colocar esses caracteres numa posição de memória não reservada para a sua variável e sobrescrever outra variável do seu programa causando resultados imprevistos na sua lógica, ou causando a falha de segmentation fault no seu programa que é gerado quando o seu programa tenta usar uma região de memória que não foi reservada para o seu programa pelo kernel do seu sistema operacional.

A função strlen retorna o tamanho da string que é a posição do caractere '\0' ou nulo. Então, se sua já tem o caractere '\0' no final dela, não há necessidade de fazer "exemplo[strlen(exemplo)-1] = '\0';", porque essa parte está colocando o caractere nulo onde já tem um caractere nulo.

Uma boa pratica para garantir que você tenha '\0' no restante do seu vetor mesmo que você não tenha certeza que a função que você esta usando já coloque o '\0' no final da string, é usando a função "memset(exemplo, '\0', 10);" da biblioteca &lt;string.h&gt;. A função memset recebe como parametros, 1º o vetor a ser setado, 2º o caractere que vai ser setado em todo o vetor, 3º a quantidade de vezes. No exemplo a variavel exemplo terá as 10 posições com o valor '\0'.



Também percebi, foi um erro meu na hora de montar o exemplo. Eu tenho um artigo no meu site sobre isso, só que com o código corrigido. É que no dia em que eu fiz a dica não percebi o erro.

[4] Comentário enviado por mauricio123 em 02/06/2020 - 23:09h


fgets(exemplo, 255, stdin);

Correção feita.

___________________________________
Conhecimento não se Leva para o Túmulo.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts