status c语言_STM32 嵌入式C语言教程--第四课C语言中的存储空间与位域
1.存储空间--堆和栈的区别
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
例子:
#include
int a = 0;//全局初始化区
char *p1;//全局未初始化区
void main()
{
int b;栈
char s[] = "abc";//栈
char *p2;栈
char *p3 = "123456"; //1234560在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //1234560放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
注意:i++和++i单独时,没有区别。当作为右值时,i++是先赋值后加,而++i是先加后赋值。
栈空间的分配问题
如:
void fun(int a,int b)
{
int c; //栈
int d; //栈
} //在栈区的存储顺序是c,d,a,b; //分配顺序就是:顺序局部变量、顺序参数
注意:for循环中应该遵循左闭右开的区间规则
2.C 位域
如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下:
struct{
unsigned int widthValidated;
unsigned int heightValidated;} status;
这种结构需要 8 字节的内存空间,但在实际上,在每个变量中,我们只存储 0 或 1。在这种情况下,C 语言提供了一种更好的利用内存空间的方式。如果您在结构内使用这样的变量,您可以定义变量的宽度来告诉编译器,您将只使用这些字节。例如,上面的结构可以重写成:
struct{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;} status;
现在,上面的结构中,status 变量将占用 4 个字节的内存空间,但是只有 2 位被用来存储值。如果您用了 32 个变量,每一个变量宽度为 1 位,那么 status 结构将使用 4 个字节,但只要您再多用一个变量,如果使用了 33 个变量,那么它将分配内存的下一段来存储第 33 个变量,这个时候就开始使用 8 个字节。让我们看看下面的实例来理解这个概念:
实例
#include
#include /* 定义简单的结构 */
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status1; /* 定义位域结构 */
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;
int main( ) {
printf( "Memory size occupied by status1 : %d", sizeof(status1));
printf( "Memory size occupied by status2 : %d", sizeof(status2));
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Memory size occupied by status1 : 8Memory size occupied by status2 : 4
位域声明
在结构内声明位域的形式如下:
struct{
type [member_name] : width ;};
下面是有关位域中变量元素的描述:
元素
描述
type
只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。
member_name
位域的名称。
width
位域中位的数量。宽度必须小于或等于指定类型的位宽度。
带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数,例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,如下:
struct{
unsigned int age : 3;} Age;
上面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。让我们来看下面的实例:
实例
#include
#include
struct {
unsigned int age : 3;
} Age;
int main( )
{
Age.age = 4;
printf( "Sizeof( Age ) : %d", sizeof(Age) );
printf( "Age.age : %d", Age.age );
Age.age = 7;
printf( "Age.age : %d", Age.age );
Age.age = 8; // 二进制表示为 1000 有四位,超出
printf( "Age.age : %d", Age.age );
return 0;
}
当上面的代码被编译时,它会带有警告,当上面的代码被执行时,它会产生下列结果:
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
未完待续........
status c语言_STM32 嵌入式C语言教程--第四课C语言中的存储空间与位域相关推荐
- MT4/MQL4入门到精通EA教程第四课-MQL语言常用函数(四)-K线取值常用函数
MQL中有一组"函数",他们长得跟其他函数不一样,是不一样的函数,就是下面这几个功能强大的"函数" Open[].Close[].High[].Low[].Ti ...
- 使用Keil语言的嵌入式C编程教程(下)
使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...
- 使用Keil语言的嵌入式C编程教程(上)
使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...
- keil窗口显示不全_使用Keil语言的嵌入式C编程教程(下)
使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...
- 怎么运行c语言程序,如何使用C语言进行编程操作,教程在这里,C语言编程快速入门...
原标题:如何使用C语言进行编程操作,教程在这里,C语言编程快速入门 C语言编程初级学习 编程语言有很多种,我们今天就介绍一种很瘦大家喜欢的C语言.该语言在大学中也是一门较为重要的学科,更是计算机学科里 ...
- 第四课: 易语言大漠剑侠情缘多线程木人巷主线程
第四课: 易语言大漠剑侠情缘多线程木人巷主线程 http://v.youku.com/v_show/id_XMjgyMDI0MzY3Mg==.html 这节课没什么 老师是把整个从城里界面开始---& ...
- 火山PC抓取快递物流查询接口教程第四课
本源码转载自利快云https://www.lkuaiy.com/ 火山PC抓取快递物流查询接口教程第四课 一.需要调用的模块 视窗基本类 MFC界面基本类 MFC界面扩展类库1 火山模块 二.火山项目 ...
- 【零基础深度学习教程第四课:卷积神经网络 (上)】
[零基础深度学习教程第四课:卷积神经网络 (上)] 一.边缘检测与卷积运算 1.1 案例分析 1.2 卷积运算 1.2.1 概述 1.2.2 具体说明 1.3 原理解读 二.卷积运算参数 2.1 几个 ...
- 初识c语言教程,第1课C语言教程一: 初识C程序.doc
第1课C语言教程一: 初识C程序 第1课 初识C程序 教学目标 1.计算机语言介绍 2.了解C语言 3.如何学好C语言(多做题,多上机调试程序) 4.C语言上机调试环境 教学过程 计算机程序设计语言的 ...
最新文章
- 数据预处理代码分享——机器学习与数据挖掘
- LineatLayout设置背景为.9图后产生位移
- 买走5355.5万张床垫的年轻人,实现“深睡自由”了吗?
- K8S 基于NFS实现文件集群间共享
- keras神经网络模型的保存与加载
- 6.1 tar:打包备份
- 技术三板斧:关于技术规划、管理、架构的思考
- SparkSQL源代码:总体概述
- VM虚拟机打开其中一个vmx文件没反应问题解决
- 再谈删除数据的SQL语句
- KNN算法实现knn完成iris数据集分类
- c语言rewind函数作用,C 文件 rewind() 函数
- java 圆类 圆锥类_喉室位于_java程序设计答案_学小易找答案
- 【RMF】ros机器人中间件框架学习系列一:了解原理
- C# TSC TE244 PrintDocument 固定资产哑银不干胶标签打印
- 2009NOIP提高组初赛讲解
- Tableau磁盘空间满清除临时文件
- Webstorm2019,最新激活码【永久】
- 注解@Primary
- LEDE/OpenWrt for TL-WDR5600(QCA956X)
热门文章
- 超全整理 | 嵌入式Linux 性能工具和诊断思路
- FPGA学习之路—接口(3)—SPI详解及Verilog源码分析
- c语言多线程 视频教程,如何用C语言实现多线程
- arp协议的主要功能是_程序员需要掌握的一些网络协议汇总
- 阿尔卡特朗讯sdh设备板卡汇总_全球通信设备企业集中,中国企业脱颖而出!
- Python猫荐书系列之七:Python入门书籍有哪些?
- Radio stations CodeForces - 762E (cdq分治)
- JavaSE | 多线程
- Web负载均衡学习笔记之四层和七层负载均衡的区别
- Java线程池理解及用法