a friend of mine and I are disagreeing on the following statements


Which are LEGAL?
Which are ILLGAL? why?

assume following:

Code:
struct node {
   char c;
   struct node * next;
};

struct node *p, *q, *r;          <----------- pointers

struct node x, y, z;                <-----------non pointers
(a) p = (struct node *)malloc(sizeof(struct node)); legal
(b) *q = (struct node *)malloc(sizeof(struct node)); illegal
(c) x = (struct node *)malloc(sizeof(struct node)); illegal
(d) p = r; legal
(e) q = y; illegal
(f) r = NULL; legal
(g) z = *p; illegal friend says legal here

(h) p = *x; illegal
(i) free(y); illegal
(j) free(*p); illegal
(k) free(r); legal
(l) *q = NULL; illegal
(m) *p = *x; illegal
(n) z = NULL; legal friend says illegal here