By first malloc function,you are trying to allocate memory to store pointers to char,
But by 2nd statement, you are trying to allocate the 'char' data types in array, which compiler would actually accept,but if later on if you try to access memory which you think you had allocated will have undefined behavior.
Hence, you may want to use actual data types on the right side, as your left side.
And, for 2nd part of your question->You can allocate any type of memory on the heap by using malloc() function.
e.g you can allocate array of struct as
struct emp **array=malloc(sizeof(struct emp *)*len)
I hope this helped.