>>52
C doesn't have a stack. A conforming implementation could implement all functions by inlining and function pointers by transforming them into the selector for a switch statement containing all valid values and inlining it (a pattern often used for state machines and interpreters). It could also use local static variables, garbage collection, or the heap for parameters and automatic variables, and use goto and heap-allocated linked lists for non-tail recursion. Some implementations transform automatic variables in non-recursive functions into static variables, some use a linked list of activation records allocated from a heap, and others use separate stacks for the return address, arguments, and local variables.
If C had an explicit stack, optimizations like tail-call elimination, register-based calling conventions, and automatic inlining would be illegal.