This code shows that b
variable is placed right after a
variable:
#include <stdio.h>
int main(void)
{
int a;
int b;
a=15;
b=2654;
printf("%d %d\n", a, b);
&a;
printf("%d %d\n", a, *(&b-1));
}
Outputs
15 2654
15 15
But when I delete &a;
b
is no longer right after a
:
int main(void)
{
int a;
int b;
a=15;
b=2654;
printf("%d %d\n", a, b);
printf("%d %d\n", a, *(&b-1));
}
Outputs
15 2654
15 21927
Why when I don't get address of a
variable then a
and b
aren't placed near each other? Is it related to compiler optimization?
Probably register allocation. Since the address of a
is never taken, its perfectly reasonable for the compiler to put it in a register.
It's also perfectly reasonable on such a short function for the compiler to simply delete a
altogether and pass a constant to printf
.
In general you can't do this; on larger functions the compiler tends to use hash objects in memory allocation; resulting in no discernible relation between variable declaration order and variable order on the stack.