ANSI C 87 and 99 both do not require a cast on the assignment of a type to a void pointer, but both require a cast when attempting to dereference said pointer (obviously).
Regarding the allocation of an incomplete type, you are first going to need to allocate space for the struct itself, and then you are going to need to allocate space for the pointers defined in the struct. Allocating space for the struct as a whole merely allocates sizeof(type*) for each pointer defined in the struct, so you need to allocate memory for where you wish the pointers to reference. Make sense? Full example:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct foo
{
char *s;
int n;
};
int main(void)
{
struct foo *f = malloc(sizeof(struct foo));
f->s = malloc(4);
strncpy(f->s, "foo", 3);
printf("%s\n", f->s);
free(f->s);
free(f);
return 0;
}