Como usar malloc() em C

Olá internautas,

o primeiro tutorial que vou passar para vocês trata de uma ferramenta poderosa em C, o malloc. Muitos não sabem o poder destrutivo que os ponteiros de C tem em programação. Mas para isso ser verdade é preciso saber comandar bem tudo isso porque senão seu código vai virar uma verdadeira bagunça. Digo isso porque muitos códigos em C geram um erro comum chamado de “segmentation fault”. E o que esse erro quer dizer? Simples. Em poucas palavras quer dizer você está acessando uma área de memória que não “deveria”. Vamos a alguns detalhes:

Para criar um ponteiro em C você define como se segue abaixo:

int* ptr,
     num;

Muitos podem até achar que tanto a variável “ptr” como “num” são do tipo ponteiro para int, mas não é o que acontece. A variável “num” é um inteiro e não um ponteiro para inteiro. Isso é um erro comum que ocorre entre os programadores. O correto seria definir como o trecho abaixo:

int *ptr,
    *num;

Agora sim. Tanto a variável “ptr” como a variável “num” são do tipo ponteiro para inteiro.

Agora que sabemos como declarar o ponteiro temos que aprender como criar um espaço dinâmico de memória reservado para eles. Isso pode ser feito utilizando a função malloc() que está definida no cabeçalho . Abaixo temos um exemplo de como usar o malloc:

ptr = (int*)malloc(sizeof(int));

O que este comando acima significa? Significa que foi alocado um espaço de memória para “ptr” e este espaço tem tamanho de um inteiro. Porém é preciso verificar se a operação deu certo, ou seja, se tinha espaço disponível para alocação. Esta verificação é feita como se segue:

if(ptr != NULL)     //a operação foi bem sucedida

Caso não haja espaço disponível na memória é retornado o valor “NULL” para o ponteiro. Este também é outro erro comum que os programadores cometem, não verificar se o malloc() foi bem-sucedido. Após usarem o malloc(), SEMPRE VERIFIQUEM SE TUDO OCORREU BEM!

Outra coisa que devemos atentar é que a função malloc() retorna um ponteiro void (void*) e é preciso fazer um casting para o tipo de ponteiro que estamos usando. Por isso no exemplo acima utilizamos o casting (int*) para indicar o tipo do ponteiro.

Uma boa recomendação é usar uma variável do tipo “size_t” para definir o tamanho do espaço a ser alocado. Veja os exemplos abaixo:

int size;                      //tamanho do espaço a ser alocado

scanf("%d", &size);
ptr = (int*)malloc(size);      //ERRADO!

NÃO FAÇAM ISSO! Nunca usem uma variável do tipo inteiro ou qualquer outro tipo a não ser que seja do tipo seja “size_t”. O modo correto está logo abaixo:

int n;                          //quantidade de inteiros
size_t size;                    //tamanho do espaço a ser alocado

scanf("%d", &n);
size = sizeof(int)*n;
ptr = (int*)malloc(size);       //será alocado espaço para 'n' inteiros

O modo para acessar os ponteiros é bem simples. Basta pensar que ele é um array e usá-lo como se fosse um. Veja este exemplo:

ptr[0] = 5;         //o primeiro inteiro de 'ptr' terá valor '5'
ptr[2] = ptr[3];    //a posição '2' de 'ptr' terá o valor da posição '3' de 'ptr'

Bem, esta é apenas uma breve explicação de como usar ponteiros e a função malloc() de C. Mas se você pretende se aprofundar ainda mais nesta poderosa linguagem de programação e se tornar um expert, aconselho acessar o curso abaixo. Com este curso você vai aprender a programar em C, mesmo sendo um iniciante:

Quero Dominar a Linguagem C

Críticas e sugestões são sempre bem-vindas.

Anúncios

3 comentários sobre “Como usar malloc() em C

  1. Paz seja convosco.
    Tutorial interessante, só faltou um pouco de explicação em relação a:
    variavel = (int * )malloc(sizeof(int));
    e:
    variavel = (* int)malloc(sizeof(int));
    Qual a diferença?

    1. Bom dia!
      Na verdade o símbolo ‘*’ tem que vir depois do tipo da variável. Inclusive já corrigi o post. Colocar o “*” antes da variável gera um erro sintático.
      Qualquer dúvida estou a disposição.

      1. Paz seja convosco.
        Obrigado pela a correção.
        Algo bem legal que pode ser feito, com ela, é criar uma estrutura de dados, com nome, ID, etc, por exemplo, simulando uma “B.D.”, e criar um vetor deste. Tipo:

        struct Info{
        char cNome[20];
        char cProfissao[20];
        int iIdade;}*sDados;

        int iValor;
        printf("Digite a quantidade que deseja na sua B.D.:\n>");
        scanf(" %d",&iValor);
        sDados=(struct Info*)malloc(iValor*sizeof(struct Info));

        Saúde e Felicidades para usted.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s