Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the point of passing arguments in the reverse order in C?

When a function call is made in C, the arguments are passed in the reverse order. This is important so that we have access to the first argument. And this some how supports varargs. I don't understand that even if you have access to the first argument, you would still need to know how many arguments the function has, otherwise you might easily slip past the last argument and start considering invalid values as arguments.

And if the argument count is required, then there is no point in passing arguments in the reverse order because you can access the first argument with (sp - 2 * number_of_arguments, sp = stack pointer.

Passing arguments in the reverse order is also supposed to help recursive calls, I don't understand how.

Thank you in advance.

like image 635
user590849 Avatar asked Sep 09 '13 01:09

user590849


People also ask

What is the reason for passing arguments by reference?

Pass-by-references is more efficient than pass-by-value, because it does not copy the arguments. The formal parameter is an alias for the argument. When the called function read or write the formal parameter, it is actually read or write the argument itself.

Does the order matter when passing arguments to a function?

Yes, it matters. The arguments must be given in the order the function expects them. C passes arguments by value. It has no way of associating a value with an argument other than by position.

What is the need of passing arguments to a function?

Passing arguments to function is a very important aspect of C++ programming. Arguments refer to values that can be passed to a function. Furthermore, this passing of arguments takes place for the purpose of being used as input information.

What is passing arguments to a function in C?

Arguments in C and C++ language are copied to the program stack at run time, where they are read by the function. These arguments can either be values in their own right, or they can be pointers to areas of memory that contain the data being passed. Passing a pointer is also known as passing a value by reference.


1 Answers

C does not define the order in which arguments are passed. In fact, some very common calling conventions (like the x86-64 SYSV ABI) pass the first several arguments in registers, with no order at all.

However, it is true that it is very common for variable-argument-list functions to have their argument pushed onto the stack from last to first. This is because the code emitted for the called function has to work with any number of additional arguments passed. You are right that the calling convention could include passing the number of additional arguments - but passing the arguments in reverse order means that this is not required, so it is a simpler option. You are correct that it is easy under this scheme to start examining values beyond the last argument passed - this is what tends to happen for example if you pass insufficient arguments to printf() for a given format string.

Functions with a fixed number of arguments can be passed in either order, and in fact left-to-right calling conventions do exist (the 16-bit Windows API used such a calling convention).

like image 182
caf Avatar answered Sep 28 '22 01:09

caf