变量入栈顺序

刚随手打印地址过程中,看到了相同的两个地址

#include <stdio.h>


void fun1(){
    int a1;
    printf("&a1: %p\n", &a1);
}

void fun2(){
    int a2;
    printf("&a2: %p\n", &a2);
}

void main(){
    fun1();
    fun2();
}

lihui@2015 ~$ cc 1.c

lihui@2015 ~$ ./a.exe
&a1: 0x22aaac
&a2: 0x22aaac

而这连个函数调用是串行的,也就是这段内存地址重复使用了,也就是fun1执行完了之后,a1的那块内存区域释放掉了,执行到fun2,再次来使用

进一步多打印一些变量地址

#include <stdio.h>

void fun(int a, int b){
    int c, d;
    printf("fun &a:             %p\n", &a);
    printf("fun &b:             %p\n", &b);
    printf("fun &c:             %p\n", &c);
    printf("fun &d:             %p\n", &d);
}

void main(){
    int a, b;
    printf("main &a:    %p\n", &a);
    printf("main &b:    %p\n", &b);
    fun(1, 2);
}

lihui@2015 ~
$ ./a.exe
main &a:        0x22aadc
main &b:        0x22aad8
fun &a:         0x22aab0
fun &b:         0x22aab8
fun &c:         0x22aa9c
fun &d:         0x22aa98

变量和地址的顺序关系图如下

0x22aa98        4bytes          fun &d
0x22aa9c        4bytes          fun &c
........        Nbytes
0x22aab0        4bytes          fun &a
0x22aab4        4bytes
0x22aab8        4bytes          fun &b
........        Nbytes
0x22aad8        4bytes          main &b
0x22aadc        4bytes          main &a

可见main函数的局部变量,fun的局部变量和形参相比,fun相关的几个变量地址更小;也就是分配内存区间的时候,都是以堆积在已经被分配的内存区域上面的方式,就跟数据结构里的栈一样,新来的放在栈顶;当函数返回结束的时候,相关变量内存会释放,相当于又出栈了,所以假如又来个串行的函数申请内存,又重新使用了刚才释放的内存区域,所以才有了地址想同的情况

局部变量分配在栈里,内存区域可以重复利用,对于函数调用

发表回复