对于C语言中的变量,存储类别可分为4种:auto(自动存储)、static(静态存储)、register(寄存器存储)、extern(外部存储)。

  • auto自动存储

    函数中的局部变量,如果不专门声明为(static)静态存储类别,都是动态地分配存储空间的,数据存储在动态存储区中

    形参与函数中定义的局部变量,都是自动变量(动态局部变量),在调用结束就会自动释放这些存储空间。也就是说,它们存储于栈区

  • static静态存储

    静态变量属于静态存储,用static关键字声明。静态变量是在编译期间被初始化的,且只能初始化一次,在整个程序运行期间静态变量不被释放。若程序没有对静态变量初始化,则编译时自动赋初值0(对数值型变量)或空字符'\0'(对字符变量),这与动态变量不同,因为动态变量未初始化时是不确定的值。虽然静态变量在整个程序运行期间不被释放,但他也只能在其作用域可见,也就是说,对于某个函数的静态局部变量,其他函数是不可以调用它的。

  • register寄存器变量

    顾名思义,寄存器变量就是存储在寄存器中的变量。一般是用于一些需要频繁读取的变量,为了提高存取效率,把局部变量放在CPU中的寄存器中,直接从寄存器中存取。

  • extern外部变量

    外部变量也称为全局变量,是定义于所有函数之外的变量,其作用域是其定义(或声明)之后的所有函数。函数可以访问外部变量的前提是在该外部变量的定义(或声明)在该函数定义或声明之前。外部变量只能初始化一次!外部变量通过关键字extern声明。

注意,当局部变量和全局变量重名时,用的是局部变量。

下面是extern的一个简单用法示例

#include <stdio.h>
//声明时也可以放这里 extern int a;
void print() {
extern int a; //由于外部变量a的定义在该函数之后,所以需要声明。且声明的时候一定要加关键字extern
//若a定义在print函数前面,则可以不用声明
printf("%d", a);
} int a = 5; int main() {
print();
return 0;
}

对于C语言的内存分配与变量的存储位置,可以参考示意图

堆和栈可参考堆和栈

  • auto变量存放在栈区
  • 程序员调用malloc申请的空间在堆区
  • 数据区
    • 静态变量(全局和局部)存放在全局(静态)区,包括已初始化和未初始化的变量
    • 常量字符串、数字等存放在常量区,加了const关键字常量也存放在常量区
  • 代码区存放程序执行代码,其值不能修改

文章C语言:内存分配---栈区、堆区、全局区、常量区和代码区_堆内存和栈内存图解有对全局区更详细介绍

全局(静态)区介绍

通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。

全局区由 .bss段 和 .data段组成,可读可写。

.bss段

未初始化的全局变量和未初始化的静态变量存放在.bss段。

初始化为0的全局变量和初始化为0的静态变量存放在.bss段。

.bss段不占用可执行文件空间,其内容由操作系统初始化。

.data段

已初始化的全局变量存放在.data段。

已初始化的静态变量存放在.data段。

.data段占用可执行文件空间,其内容有程序初始化。

参考文章

  1. C语言_存储类别
  2. C语言四大存储区域总结
  3. C语言:内存分配---栈区、堆区、全局区、常量区和代码区_堆内存和栈内存图解

C语言存储类别的更多相关文章

  1. C语言存储类别和链接

    目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 ​ 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...

  2. C语言杂谈(三)存储类别

    本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...

  3. C语言变量的存储类别

    我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...

  4. C语言_了解一下C语言中的四种存储类别

    C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...

  5. C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。

    除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...

  6. c语言 变量的存储类别以及对应的内存分配?

    <h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...

  7. C语言中存储类别、链接与内存管理

      第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...

  8. [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别

    C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...

  9. C语言的存储类别和动态内存分配

    存储类别分三大类: 静态存储类别 自动存储类别 动态分配内存 变量.对象--->内存管理 内存考虑效率(时间更短.空间更小) 作用域 链接.---->空间 存储器   ----->时 ...

  10. C++变量存储类别和内存四区

    变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...

随机推荐

  1. Java 使用ArrayList获取10个1-20之间的随机数,要求不能重复

    代码如下: public static void main(String[] args) { List<Integer> nums = new ArrayList<Integer&g ...

  2. FFmpeg合并视频和音频文件

    使用IDM下载Bilibili的视频会出现音视频分离的问题,通常文件大的是视频(没有声音),文件小的是单独的音频. 将两个文件都下载下来后,可以使用FFmpeg将其合并成一个视频文件.首先去FFmpe ...

  3. QOJ 6504. CCPC Final 2022 D Flower's Land 2题解

    QOJ 6504. CCPC Final 2022 D Flower's Land 2题解 题意简述 给你一个只含 \(0,1,2\) 的序列,相邻两个相同的数字可以直接消掉. 询问包含两种 区间所有 ...

  4. study the docker network of macvlan

    Introduce: 在 Macvlan 出现之前,我们只能为一块以太网卡添加多个 IP 地址,却不能添加多个 MAC 地址,因为 MAC 地址正是通过其全球唯一性来标识一块以太网卡的,即便你使用了创 ...

  5. Sealos 私有化部署完全指南

    Sealos 用了五年的时间从一个 K8s 一键安装工具蜕变成了一个真正的云操作系统,将产品体验提升到了极致,也收获了 10w+ 的社区用户. 一个多月前,Sealos 正式发布了公有云托管版本,社区 ...

  6. C# 处理 csv 文件中的双引号

    C# CSV 双引号处理 直接上代码,自己写的,有问题可以随时联系 // 没有保证所有的都能对上,目前只处理了自己所遇见的格式 public static string[] SplitStr(stri ...

  7. 【go语言】2.4.1 如何导入和使用包

    在 Go 语言中,包(package)是代码的组织方式.每个 Go 程序都由包构成,程序从 main 包开始运行. 导入包 使用 import 关键字可以导入包.导入的包可以是 Go 标准库中的包,也 ...

  8. OpenCV实战:从图像处理到深度学习的全面指南

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用.从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入OpenCV的实战世界. 1. OpenCV ...

  9. 论文解读(APCA)《Adaptive prototype and consistency alignment for semi-supervised domain adaptation》

    [ Wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Adaptive prototype and consistency alignment for semi-super ...

  10. 牛客小白月赛65 D题 题解

    原题链接 题意描述 一共有两堆石子,第一堆有 \(a\) 个,第二堆有 \(b\) 个,牛牛和牛妹轮流取石子,牛牛先手,每次取石子的时候只能从以下 \(2\) 种方案种挑一种来取(对于选择的方案数必须 ...