【C语言】【unix c】静态变量和自动变量的区别

来源:互联网 发布:广东毕业生就业数据 编辑:程序博客网 时间:2024/05/16 10:34
代码:    #include <stdio.h>    #include <sys/types.h>    #include <unistd.h>    void count(void) {        static int i = 1;//默认就是auto类型的,在函数结束的时候,函数的栈桢释放,i也就释放了        //这里加static后,i所在的存储地方由栈变为数据段,每次运行该函数i是已经确认了的,不变的        //但是这里的作用域还是得区别的        //全局变量的存储地方也是数据段        printf("++i = %d\n", ++i);        printf("i address:%p\n", &i);        return;    }    int main(void) {         int i;         for(i = 0; i < 5; i++) {        count();        }        getchar();        return 0;    }        自动变量:            命令: tarena@ubuntu:~/day/day26$ gcc memory.c            命令: tarena@ubuntu:~/day/day26$ ./a.out             结果  pid:4157                ++i = 2                i address:0xbf83bd6c                ++i = 2                i address:0xbf83bd6c                ++i = 2                i address:0xbf83bd6c                ++i = 2                i address:0xbf83bd6c                ++i = 2                i address:0xbf83bd6c            命令: tarena@ubuntu:~/day/day26$ cat /proc/4157/maps            结果: 08048000-08049000 r-xp 00000000 08:08 1055618    /home/tarena/day/day26/a.out                08049000-0804a000 r--p 00000000 08:08 1055618    /home/tarena/day/day26/a.out                0804a000-0804b000 rw-p 00001000 08:08 1055618    /home/tarena/day/day26/a.out                b7526000-b7527000 rw-p 00000000 00:00 0                 b7527000-b76c6000 r-xp 00000000 08:08 4991391    /lib/i386-linux-gnu/libc-2.15.so                b76c6000-b76c8000 r--p 0019f000 08:08 4991391    /lib/i386-linux-gnu/libc-2.15.so                b76c8000-b76c9000 rw-p 001a1000 08:08 4991391    /lib/i386-linux-gnu/libc-2.15.so                b76c9000-b76cc000 rw-p 00000000 00:00 0                 b76df000-b76e3000 rw-p 00000000 00:00 0                 b76e3000-b76e4000 r-xp 00000000 00:00 0          [vdso]                b76e4000-b7704000 r-xp 00000000 08:08 4991371    /lib/i386-linux-gnu/ld-2.15.so                b7704000-b7705000 r--p 0001f000 08:08 4991371    /lib/i386-linux-gnu/ld-2.15.so                b7705000-b7706000 rw-p 00020000 08:08 4991371    /lib/i386-linux-gnu/ld-2.15.so                bf81c000-bf83d000 rw-p 00000000 00:00 0          [stack]            分析: 观察可以发现:自动变量存在栈里面,在每次调用函数的时候原变量的数据不会被保存,即定义好自动变量后,变量放在栈头,在该变量使用后栈指针向上移动,也就是该变量清空        静态变量:            命令: tarena@ubuntu:~/day/day26$ gcc memory.c            命令: tarena@ubuntu:~/day/day26$ ./a.out             结果: pid:4166                ++i = 2                i address:0x804a01c                ++i = 3                i address:0x804a01c                ++i = 4                i address:0x804a01c                ++i = 5                i address:0x804a01c                ++i = 6                i address:0x804a01c            命令: tarena@ubuntu:~/day/day26$ cat /proc/4166/maps            结果: 08048000-08049000 r-xp 00000000 08:08 1055618    /home/tarena/day/day26/a.out                08049000-0804a000 r--p 00000000 08:08 1055618    /home/tarena/day/day26/a.out                0804a000-0804b000 rw-p 00001000 08:08 1055618    /home/tarena/day/day26/a.out                b757e000-b757f000 rw-p 00000000 00:00 0                 b757f000-b771e000 r-xp 00000000 08:08 4991391    /lib/i386-linux-gnu/libc-2.15.so                b771e000-b7720000 r--p 0019f000 08:08 4991391    /lib/i386-linux-gnu/libc-2.15.so                b7720000-b7721000 rw-p 001a1000 08:08 4991391    /lib/i386-linux-gnu/libc-2.15.so                b7721000-b7724000 rw-p 00000000 00:00 0                 b7737000-b773b000 rw-p 00000000 00:00 0                 b773b000-b773c000 r-xp 00000000 00:00 0          [vdso]                b773c000-b775c000 r-xp 00000000 08:08 4991371    /lib/i386-linux-gnu/ld-2.15.so                b775c000-b775d000 r--p 0001f000 08:08 4991371    /lib/i386-linux-gnu/ld-2.15.so                b775d000-b775e000 rw-p 00020000 08:08 4991371    /lib/i386-linux-gnu/ld-2.15.so                bfcf6000-bfd17000 rw-p 00000000 00:00 0          [stack]            分析: 静态变量/全局变量是存在数据段中的,每次调用不会清空数据
阅读全文
0 0
原创粉丝点击