I am trying to illustrate the reverse order of parameters on the stack when passed to a function in C:
#include <stdio.h>
void p(int p1, int p2, double p3)
{
printf("params:\n"
"1) %p offset = %li\n"
"2) %p offset = %li\n"
"3) %p\n",
(void *)&p1, (void *)&p1 - (void *)&p2,
(void *)&p2, (void *)&p2 - (void *)&p3,
(void *)&p3);
}
int main(int argc, char *argv[])
{
struct A a = {10,11,12, {1,2,3}};
p(-1, 0, +1);
return(0);
}
Result is:
params:
1) 0x7ffe2f20afac offset = 4
2) 0x7ffe2f20afa8 offset = 8
3) 0x7ffe2f20afa0
This is as expected on the 64 bit system (Ubuntu 19.04)
When I pass a structure as a parameter the stack looks puzzling to me:
#include <stdio.h>
struct A {
int n1;
int n2;
int n3;
int arr[3];
};
void p(int p1, struct A p2, double p3)
{
printf("params:\n"
"1) %p offset = %li\n"
"2) %p offset = %li\n"
"3) %p\n",
(void *)&p1, (void *)&p1 - (void *)&p2,
(void *)&p2, (void *)&p2 - (void *)&p3,
(void *)&p3);
}
int main(int argc, char *argv[])
{
struct A a = {10,11,12, {1,2,3}};
p(-1, a, +1);
return(0);
}
Now result is:
params:
1) 0x7ffee5f7ddbc offset = -20
2) 0x7ffee5f7ddd0 offset = 32
3) 0x7ffee5f7ddb0
Parameter 3 is close to 1 and parameter 2 is not between 1 and 3? offsets look wrong to me.Please shed some light here, thanks in advance.
The compiler is gcc 7.4.0