It may be legal, but there are a few pitfalls.
First, if you (or a later maintainer) blindly replace the type with an expression you'll have problems:
sizeof(char *) * 4 => sizeof(x) * 4 // OK
sizeof(char *[4]) => sizeof(x[4]) // NOT OK
Second, not all compilers may support variable length arrays:
sizeof(char *) * n // ALWAYS SUPPORTED
sizeof(char *[n]) // MAY NOT BE SUPPORTED
Finally, it's not a very common idiom, so people reading the code might be momentarily confused.
Whether these pitfalls make it worth the effort to change your habits is up to you, of course :)