Jump to content

Atenção função MALLOC.


dardevelin

Recommended Posts

Boas, tenho visto inúmeras vezes as pessoas a fazerem cast a função malloc, e por saber que muitos livros cometem o erro decidi expor o problema de fazer tal uso.

Não há necessidade de fazer cast ao resultado de funções que retornam void *;

Só faz o codigo mais difícil de ler, não adiciona qualquer valor, e pode esconder bugs se não tiverem um prototipo valido

dentro do escopo.

Um exemplo

Imaginem que chamaram a função malloc mas esqueceram-se de fazer #include <stdlib.h> . O compilador pode ser facilmente "enganado" e assumir que a função retorna int, o que claro é incorrecto e pode levar a problemas.

Contudo se chamarem malloc da seguinte forma:


char *p = malloc(10);

O compilador ira notar que estão a atribuir um int a um apontador, e irá emitir um aviso, algo parecido com isto:

``assignment of pointer from integer lacks a cast"

O problema é claramente que esqueceram-se de fazer o #include <stdlib.h> e não o esquecer de fazer um cast. No entanto

se usarem a função desta forma:


char *p = (char *) malloc(10);

O compilador vai assumir que sabem o que estão a fazer e muito provavelmente não vai emitir nenhum aviso, tornando um bug invisível.

Informação retirada de

http://c-faq.com/mal...llocnocast.html

EDIT: concertar o geshi

Edited by dardevelin
Link to comment
Share on other sites

Por outro lado, se não usarmos o cast, ficamos com um warning que só distrai. Acabamos por chegar a um ponto em que ignoramos os warnings todos, porque pensamos que são apenas casts em falta, quando pode estar efectivamente alguma errada.

Pessoalmente, tento sempre deixar eu programas que faço sem warnings. Sempre que um novo aparece, sei que lhe tenho que dar atenção, seja para corrigir um erro, ou simplesmente para adicionar um cast ou outra coisa qualquer que elimine o warning.

Se simplesmente ignorarmos os warnings, estes tornam-se inúteis (também o vamos ignorar quando nos esquecermos do include, que por acaso nem me parece que seja propriamente um bug).

Ver próximos comentários 🙂

Link to comment
Share on other sites

Por outro lado, se não usarmos o cast, ficamos com um warning que só distrai.

So ficas com o warning (ou erro) se compilares o codigo com um compilador de C++ (ou com um compilador de C esquisito, com extras manhosos).

A atribuicao do resultado do malloc() a qualquer objecto de tipo ponteiro para qualquer tipo de objecto nao requer nenhuma mensagem do compilador, antes pelo contrario: deve ser efectuada sem queixas.

  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Estava na ideia que quando comecei a programar em C esse warning aparecia.

Mas fui agora testar, e tal não acontece. Também verifiquei que o GCC emite o warning se o include estiverem falta, independentemente de haver cast ou não.

Mas não havendo o warning na ausência de cast, o cast torna-se efectivamente desnecessário.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.