Your error comes from passing a stack ** to CreateEmpty. (You're taking the address of a pointer, &S.) Same goes for the Destruct error. Match your types up.
Also:
That doesn't do what the comment alleges it does. That set S (a pointer) to the address of S2. S goes out of scope afterwards, and that statement has no effect.Code:S = &S2;/*(copy stack S2 to stack S)*/
Also, "Nil" ? The general rule for #defines is to make them all caps. I'd also use NULL over "Nil" - other programs will read "Nil" and go hunt to find out what Nil is. (Since it's not in caps, it's not obvious it's a define, though one might assume things based on context.)