This may be legal, but there are a few pitfalls.
First, if you (or the maintainer later) blindly replace the type with an expression, you will have problems:
sizeof(char *) * 4 => sizeof(x) * 4
sizeof(char *[4]) => sizeof(x[4])
Secondly, not all compilers can support variable length arrays:
sizeof(char *) * n
sizeof(char *[n])
Finally, this is not a very common idiom, so people reading the code can be confused for a moment.
, , , :)