It's an error. The C standard is organized even worse than the C++ standard, but 6.5.4p3 says, "Conversions that involve pointers, other than where permitted by the constraints of 6.5.16.1, shall be specified by means of an explicit cast."
And said section permits, paraphrased:
1) Conversion between arithmetic types.
2) Conversion between compatible structures and unions.
3) Conversion between pointers to compatible types, where cv qualification is not lost.
4) Conversion between void* and other pointer types, where cv qualification is not lost.
5) Conversion from a null pointer constant to a pointer.
6) Conversion from a pointer to _Bool.
Hmm ... what mode (C or C++) and warning level? There should be at least a warning. (There's an awful lot of really, really bad legacy C code out there, which is why most compilers accept the code. But they should still warn.)