Melhor Controle de Memória de Strings em C

Publicado por Mauricio Ferrari em 11/05/2020

[ Hits: 1.870 ]

Blog: https://www.youtube.com/@LinuxDicasPro

 


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

OpenArena que funciona no Linux Mint 20

Configurando o slackpkg para não apagar os pacotes após atualizações

ExMplayer no Linux Mint 20

Executando Arquivo de Mídia .opus pelo Terminal

Instalando Vim 8.2 completo no Linux Mint 20

Leitura recomendada

Instalando Code::Blocks no Ubuntu 12.04

Função recursiva para inverter um vetor de caracteres

Usando comandos do sistema em C

Site para quem está iniciando em C

Classes para vários tipos (templates)

  

Comentários
[1] Comentário enviado por maurixnovatrento 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 maurixnovatrento 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 maurixnovatrento 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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts