首页 > 其他分享 >C语言 静态变量的初始化

C语言 静态变量的初始化

时间:2023-04-05 09:01:43浏览次数:36  
标签:初始化 变量 静态 程序 函数调用 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语言,内存
From: https://www.cnblogs.com/zhanggaofeng/p/17288804.html

相关文章

  • linux下c语言的crypt函数怎么用?
    linux的crypt最近学校布置了一个网安的小作业,要用到linux里面的这个crypt函数,写一篇总结一下。首先我们要了解这个函数是用来做什么的。密码影子文件中存储了每一个用户的用户明文和其单向哈希过的秘文cipher="$1$C68vnJ27$1ttFZ1/Rylq/xi350A0NI0";密码字段用\(id\)salt$......
  • 关于vs生成静态库文件并使用
    开发豆之助桌宠(QT)时想加一个二维码生成功能,于是想引入qrencode库,找到了其原文件,直接把整个文件加到工程项目太过笨重,于是我想用vs生成lib引入。生成时遇到很多问题并一一解决1.在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include"pch.h"?解决方法:1)在解决方......
  • C语言——复杂指针的读写
     1int*(*(*(*abc)())[6])();2/*3*1、(*abc)()——函数指针4*2、(*(某1))[6]——某的数组的指针5*3、int*(*(某2))()——返回值为int*类型的某的函数指针6*组合方式:123217*组合:(以(指向((返回值为int*类型的(函数指针))数组)的指针)......
  • c# .net 静态织入 代码生成 Source Generators
    必须创建netstandard项目【ClassLibrary1】来存放代码生成接口[Generator]publicclassDemoSourceGenerator:ISourceGenerator{publicvoidExecute(GeneratorExecutionContextcontext){//Findthemainmethodv......
  • 【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】
    一、Aware接口&InitializingBean1、基础准备2、总结3、补充:EmbeddedValueResolverAware二、@Autowired和@PostConstruct注解失效1、基础准备2、失效情形3、失效原因4、使用Aware接口避免失效5、总结补充总结一、Aware接口&InitializingBean1、基础准备①编写MyBean实......
  • C语言字符串IP转4字节
    点击查看代码#include<stdio.h>#include<string.h>voidstr2ip(char*in,unsignedchar*out){ inti; inttmp[4]={0}; sscanf(in,"%d.%d.%d.%d",tmp,tmp+1,tmp+2,tmp+3); for(i=0;i<4;i++) { out[i]=tmp[i]&0x......
  • 逍遥自在学C语言 | 算数运算符
    前言一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、算数运算符简介C语言的算数运算符,是用来完成基本的算术运算的符号。按操作数个数可分为一元运算符(含一个操作数)和二元运算符......
  • Windows批处理文件初始化数据库
    前提是MySQL服务必须启动,Windows添加了MySQL的环境变量。批处理文件:@ECHOOFFSETdbhost=127.0.0.1SETdbuser=rootSETdbpasswd=rootSETdbName=xc_ntpclientmonitorSETsqlfile=C:\\ProgramFiles\\NTSM\\20210401_xc_ntpclientmonitor.sql::执行SQL脚本初始化数据......
  • Linux c语言编程./a.out运行提示段错误
    段错误,几种可能:一、函数没有头文件(是的,有时候gcc不会提示没有头文件);二、函数重复定义,全局变量定义后、局部变量又定义了。(一般是调试的时候,代码改来改去,遗漏所致)三、Linux发行版系统差异,虽然都是Linux内核,同样的函数Ubuntu和CentOS需要的头文件就不一样,具体查看ma......
  • 窗口编程初始化
    JFramejf;Containercontainer;voidinit(){//初始化框架jf=newJFrame();jf.setSize(400,500);//将容器放在框架上获得容纳面板container=jf.getContentPane();//做其他事情//设置窗口可视化jf.setVisible(true);//设......