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语言中的存储空间与位域相关推荐

  1. MT4/MQL4入门到精通EA教程第四课-MQL语言常用函数(四)-K线取值常用函数

    MQL中有一组"函数",他们长得跟其他函数不一样,是不一样的函数,就是下面这几个功能强大的"函数" Open[].Close[].High[].Low[].Ti ...

  2. 使用Keil语言的嵌入式C编程教程(下)

    使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...

  3. 使用Keil语言的嵌入式C编程教程(上)

    使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...

  4. keil窗口显示不全_使用Keil语言的嵌入式C编程教程(下)

    使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...

  5. 怎么运行c语言程序,如何使用C语言进行编程操作,教程在这里,C语言编程快速入门...

    原标题:如何使用C语言进行编程操作,教程在这里,C语言编程快速入门 C语言编程初级学习 编程语言有很多种,我们今天就介绍一种很瘦大家喜欢的C语言.该语言在大学中也是一门较为重要的学科,更是计算机学科里 ...

  6. 第四课: 易语言大漠剑侠情缘多线程木人巷主线程

    第四课: 易语言大漠剑侠情缘多线程木人巷主线程 http://v.youku.com/v_show/id_XMjgyMDI0MzY3Mg==.html 这节课没什么 老师是把整个从城里界面开始---& ...

  7. 火山PC抓取快递物流查询接口教程第四课

    本源码转载自利快云https://www.lkuaiy.com/ 火山PC抓取快递物流查询接口教程第四课 一.需要调用的模块 视窗基本类 MFC界面基本类 MFC界面扩展类库1 火山模块 二.火山项目 ...

  8. 【零基础深度学习教程第四课:卷积神经网络 (上)】

    [零基础深度学习教程第四课:卷积神经网络 (上)] 一.边缘检测与卷积运算 1.1 案例分析 1.2 卷积运算 1.2.1 概述 1.2.2 具体说明 1.3 原理解读 二.卷积运算参数 2.1 几个 ...

  9. 初识c语言教程,第1课C语言教程一: 初识C程序.doc

    第1课C语言教程一: 初识C程序 第1课 初识C程序 教学目标 1.计算机语言介绍 2.了解C语言 3.如何学好C语言(多做题,多上机调试程序) 4.C语言上机调试环境 教学过程 计算机程序设计语言的 ...

最新文章

  1. 数据预处理代码分享——机器学习与数据挖掘
  2. LineatLayout设置背景为.9图后产生位移
  3. 买走5355.5万张床垫的年轻人,实现“深睡自由”了吗?
  4. K8S 基于NFS实现文件集群间共享
  5. keras神经网络模型的保存与加载
  6. 6.1 tar:打包备份
  7. 技术三板斧:关于技术规划、管理、架构的思考
  8. SparkSQL源代码:总体概述
  9. VM虚拟机打开其中一个vmx文件没反应问题解决
  10. 再谈删除数据的SQL语句
  11. KNN算法实现knn完成iris数据集分类
  12. c语言rewind函数作用,C 文件 rewind() 函数
  13. java 圆类 圆锥类_喉室位于_java程序设计答案_学小易找答案
  14. 【RMF】ros机器人中间件框架学习系列一:了解原理
  15. C# TSC TE244 PrintDocument 固定资产哑银不干胶标签打印
  16. 2009NOIP提高组初赛讲解
  17. Tableau磁盘空间满清除临时文件
  18. Webstorm2019,最新激活码【永久】
  19. 注解@Primary
  20. LEDE/OpenWrt for TL-WDR5600(QCA956X)

热门文章

  1. 超全整理 | 嵌入式Linux 性能工具和诊断思路
  2. FPGA学习之路—接口(3)—SPI详解及Verilog源码分析
  3. c语言多线程 视频教程,如何用C语言实现多线程
  4. arp协议的主要功能是_程序员需要掌握的一些网络协议汇总
  5. 阿尔卡特朗讯sdh设备板卡汇总_全球通信设备企业集中,中国企业脱颖而出!
  6. Python猫荐书系列之七:Python入门书籍有哪些?
  7. Radio stations CodeForces - 762E (cdq分治)
  8. JavaSE | 多线程
  9. Web负载均衡学习笔记之四层和七层负载均衡的区别
  10. Java线程池理解及用法