C语言 静态变量的初始化

一、C程序的内存分布

C程序由下面5部分组成

正文段(.text):通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常量,例如字符串常量等。

初始化数据段(.data):通常是指用来存放程序中已初始化的全局变量的一块区域,在进程运行时静态分配。

未初始化数据段(.bss):存放包含程序中未初始化的全局变量和static变量。BBS是英文block started by symbol的简称。由于未初始化,因此默认值为0。为了节省磁盘空间,程序中并不需要保存这些变量的映像,只将所需要的BSS段大小记录在程序文件中,但BSS段并不占据任何空间,在进程运行时静态分配

栈(stack):按内存地址由高到低方向生长,其最大大小由编译时确定,自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次函数调用时,其返回地址以及调用者的环境信息(如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过这种方式使用栈,C递归函数可以工作。递归函数每次调用自身时,就用一个新的栈帧,因此一次函数调用实例中的变量集不会影响另一次函数调用实例中的变量。

堆(heap):自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于未初始化数据段和栈之间。
每个线程都会有自己的栈,但是堆空间是共用的。

备注:.text段和.data段都在可执行文件中,由系统从可执行文件中加载;而.bss段不在可执行文件中,由系统初始化。

c程序内存分布图

二、静态变量(包括全局变量、静态全局变量、静态局部变量)

1) 内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2) 数据存储:
a) 已初始化的存储在数据区中的已初始化变量区
b) 未初始化的存储在数据区中的未初始化变量区(未经初始化的全局静态变量会被程序自动初始化为0)
3) 生命周期:静态变量的生命周期是从所处模块装载到所处模块卸载

三、局部变量和静态变量的初始化有何不同

未初始化的局部变量位于栈中,它的位置是不确定的,因此其值也是不确定的。
静态变量的地址是确定的,并且存放在了数据段,而程序在运行之前,未初始化数据段的内容可以很方便地统一被初始化为0

/* C语言静态变量的初始化 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int m;

void test()
{
    static int n = 99;

    // 打印 m is 0, n is 99
    printf("m is %d, n is %d\n", m, n);
}

int main()
{
    test();
    return 0;
}

 

C语言 全局变量,全局静态变量,局部静态变量的理解 - 寒魔影 - 博客园 (cnblogs.com)

posted on 2023-04-05 08:36  寒魔影  阅读(436)  评论(0编辑  收藏  举报

导航