In this question, someone suggested in a comment that I should not cast the results of
malloc
, i.e:int *sieve = malloc(sizeof(int)*length);
rather than:
int *sieve = (int *)malloc(sizeof(int)*length);
Why would this be the case?
Answers:-
You don't cast the result, since:
- It is unnecessary, as
void *
is automatically and safely promoted to any other pointer type in this case. - It can hide an error, if you forgot to include
<stdlib.h>
. This can cause crashes, in the worst case. - It adds clutter to the code, casts are not very easy to read (especially if the pointer type is long).
- It makes you repeat yourself, which is generally bad.
As a clarification, note that I said "you don't cast", not "you don't need to cast". In my opinion, it's a failure to include the cast, even if you got it right. There are simply no benefits to doing it, but a bunch of potential risks, and including the cast indicates that you don't know about the risks.
Also note, as commentators point out, that the above changes for straight C, not C++. I very firmly believe in C and C++ as separate languages.
To add further, your code needlessly repeats the type information (
int
) which can cause errors. It's better to dereference the pointer being used to store the return value, to "lock" the two together:int *sieve = malloc(length * sizeof *sieve);
This also moves the
length
to the front for increased visibility, and drops the redundant parentheses with sizeof
; they are only needed when the argument is a type name. Many people seem to not know (or ignore) this, which makes their code more verbose. Remember: sizeof
is not a function! :)
0 comments:
Post a Comment