C语言存储类别
对于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段占用可执行文件空间,其内容有程序初始化。

参考文章
C语言存储类别的更多相关文章
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...
- C语言杂谈(三)存储类别
本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...
- C语言变量的存储类别
我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...
- C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...
- c语言 变量的存储类别以及对应的内存分配?
<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...
- C语言中存储类别、链接与内存管理
第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...
- [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别
C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...
- C语言的存储类别和动态内存分配
存储类别分三大类: 静态存储类别 自动存储类别 动态分配内存 变量.对象--->内存管理 内存考虑效率(时间更短.空间更小) 作用域 链接.---->空间 存储器 ----->时 ...
- C++变量存储类别和内存四区
变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...
随机推荐
- 寻找一个好的工程师不只是看ta的刷题能力
面试一个工程师,该考察什么能力,如果单单背诵一些概念.题目好像是在考察记忆力,最终项目里还是得解决实际问题.但解决实际问题的能力真的不易考察,导致大部分公司面试前期都只能通过试题来筛选求职者,到面试后 ...
- List 接口及其常用方法
List 接口基本介绍 List接口是Collection接口的子接口,其主要特点如下: List中元素有序,是按照元素的插入顺序进行排序的.每个元素都有一个与之关联的整数型索引(索引从 0 开始), ...
- 行行AI人才直播第5期:系列课-AI理解及ChatGPT从基础到高级应用
当前,人工智能是全世界研究的重点对象,也是人们茶余饭后讨论的经典话题.自从 OpenAI 发布 ChatGPT-4 之后,似乎无论是在工作.娱乐.甚至是日常生活中,我们都能感受到AI带来的便利和改变. ...
- "Process finished with exit code 1" 进程结束
问题描述 : springboot 程序运行出现以下情况 没有错误日志 返回运行结束 状态码 1 状态码为 1 的时候表示程序不是异常终止 连接到目标VM, 地址: ''127. ...
- 什么是ORM (object real mapping)
一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用 ...
- MODBUS-TCP转Ethernet IP 网关连接空压机配置案例
本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例.使用设备:欧姆龙PLC,捷米特JM-EIP-TCP网关, ETHER ...
- java无法加载maper.xml问题
项目依赖其他模块,模块中有 mapper,本项目也有mapper,导致项目无法正常运行. 解决办法: 1.配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.X ...
- Angular报错:Error: Unknown argument: spec
解决方案 使用--skip-tests代替 效果展示 可以看到spec.ts消失了 参考链接 https://stackoverflow.com/questions/62228834/angular- ...
- JVM调优篇:探索Java性能优化的必备种子面试题
JVM内存模型 首先面试官会询问你在进行JVM调优之前,是否了解JVM内存模型的基础知识.这是一个重要的入门问题.JVM内存模型主要包括程序计数器.堆.本地方法栈.Java栈和方法区(1.7之后更改为 ...
- Cookies 完全指南
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:佳岚 前言 Cookie实际上是一小段的文本信息,它产生的 ...