Function arguments ("parameters") need not be stored at all. Remember: C uses call by value. A value need not be stored in a memory location, it could live in a register, or its value may be concluded from the program state in some way.
For example, library functions like strlen() or sin() , cos(), sqrt() could be implemented in hardware. sin(x) could be implemented by storing some value(s) that correspond to x into special-function registers, issuing a special-function instruction and pulling the result out. (floating point hardware sometimes even has pseudo-instructions to represent for instance Pi in the best possible precision. The Pi value is never passed, only the instruction: "use Pi/2")
Even for "normal" user-defined functions, the arguments could be passed via registers, multiple arguments could be combined into a large register, maybe even optimised out.
This is best visible with inlined functions, these can totally disappear, because their functionality has been combined with that of the caller.
Things get different when the function takes the address of one of its arguments (for instance int func(int arg) { int *p = &arg; } will force arg to have an address), but this case is relatively rare.
WRT the standard: a C function has an activation record. (Non-standard people would probably call it a "stack frame"). And the function behaves as if the arguments are part of its local variables, and they go out of scope once the function returns. How they get their values is totally irrelevant, theoretically it could even be done by message passing.