热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxC编程(二)数据与函数的存储类型和内存管理

本篇文章为C语言基础系列~~变量的存储类型变量的存储类型主要定义了变量的作用域,连接属性,存储属性。1.存储属性1.1作

本篇文章为C语言基础系列~~

变量的存储类型
变量的存储类型主要定义了变量的作用域,连接属性,存储属性。

1. 存储属性
1.1 作用域
表示该变量可以被使用的区域。分为代码块作用域,函数原型作用域,文件作用域。 
如对于下面的一个main.c而言,var_ file作用域为整个文件main.c,var_ function作用域为main函数,var _code _block作用域仅为for循环的{}中。作用域不重合的两个变量可以重名。

#include
int var_file = 0;
int main()
{
    int var_function = 0;
    int i = 0;
    for (i &#61; 0;i <10;i&#43;&#43;)
    {
        int var_code_block &#61; 0;
        ...
    }
}

1.2 链接属性
主要表示该变量是否能够被外部文件所使用&#xff0c;即链接。分为外部链接&#xff0c;内部链接&#xff0c;空链接。外部链接表示该变量能够被任意外部文件里的函数所使用&#xff0c;内部链接表示该变量仅能够被文件内部的任意函数所使用。

代码块作用域和函数作用域的变量链接属性只能为空链接。 
文件作用域的变量可以默认为外部链接。当其加入static限定符时为内部链接。

外部链接和内部链接属性只有在多文件应用中才起作用。

1.3 时间属性
主要表示该变量在内存中的生存周期。分为静态周期和自动周期。静态周期的变量在程序运行期间一直在内存中存在&#xff0c;自动周期的变量退出作用域后自动注销。 
∙∙具有文件作用域的变量具有静态周期属性&#xff0c;与其链接属性无关。 
∙∙具有函数和代码块作用域的变量默认具有自动周期属性&#xff0c;当其加入static限定符时&#xff0c;具有静态周期属性

属性总结&#xff1a; 
&#xff08;1&#xff09;局部变量&#xff08;函数作用域和代码块作用域&#xff09;&#xff0c;全局变量&#xff08;文件作用域&#xff09; 
&#xff08;2&#xff09;局部变量一直为空链接&#xff0c;static可以限定全局变量的链接属性 
&#xff08;3&#xff09;全局变量具有静态生存周期&#xff0c;static可以限定局部变量的生存周期

2. 四种存储类型
主要由auto&#xff0c;register&#xff0c;static&#xff0c;extern四种存储类型

auto
具有自动周期属性&#xff0c;函数作用域或者代码块作用域&#xff0c;空链接属性。 
不会自动初始化&#xff0c;为随机值。 
在函数和代码块内部&#xff0c;auto为默认缺省属性。&#xff08;函数外部不缺省&#xff01;&#xff09;

register
使用该存储方式定义时&#xff0c;是在请求将该变量放在寄存器中&#xff0c;这样能够操作的更快。但这只是一个请求&#xff0c;是否能被满足还需要考虑当时的寄存器和内存的使用情况。 
另外&#xff0c;register不能够用来定义一些类似于double型的数据&#xff0c;因为double占用64字节&#xff0c;没有与之对应的寄存器可以存储。

static
作用在全局变量&#xff08;文件作用域&#xff0c;静态生存周期&#xff09;上&#xff0c;表示使其具有内部链接属性&#xff0c;否则具有外链接属性 
作用在局部变量上&#xff08;函数或代码块作用域&#xff0c;空链接&#xff09;&#xff0c;表示使其具有静态生存周期&#xff0c;否则具有自动生存周期 
也即&#xff1a; 
全局变量&#xff1a;文件作用域&#xff0c;外链接属性&#xff0c;静态生存周期 
局部变量&#xff1a;局部作用域&#xff0c;空链接属性&#xff0c;自动生存周期 
静态全局变量&#xff1a;文件作用域&#xff0c;内链接属性&#xff0c;静态生存周期 
静态局部变量&#xff1a;局部作用域&#xff0c;空链接属性&#xff0c;静态生存周期

extern
作用在变量上&#xff0c;表示声明在该变量作用域外部定义的变量&#xff0c;适用于全局变量与局部变量

extern并不改变变量的存储属性&#xff0c;只是在多文件编译时&#xff0c;和链接属性共同使用

注意以下的不同&#xff0c;extern一般只在变量声明的时候使用

extern int age &#61; 0;//变量的定义&#xff0c;一般不用
extern int age;//变量的声明
1
2
函数的存储类型
同变量一样&#xff0c;函数也具有存储类型&#xff0c;主要有两种&#xff1a;static与extern 
static表示函数的作用域为本文件&#xff0c;extern表示函数的作用域为任意外部文件。static函数的存在是为了增加私有性&#xff0c;避免函数命名的冲突。 
与变量中extern只在声明时起作用不同&#xff0c;函数的存储类型在定义和声明的时候都要显示写出&#xff08;extern的定义和声明为缺省状态&#xff0c;可以不写&#xff09;

C程序运行时的内存分配
上述的四中存储类型一旦确定&#xff0c;应用程序在执行时数据的内存分配就必须满足相应固定的规则。

操作系统中的应用程序
对于操作系统中的应用而言&#xff0c;该规则由操作系统根据系统当时所处的状态来分配&#xff1b;

操作系统中的C应用程序在执行时其占用的内存细分如下&#xff1a;

代码区&#xff1a;存放代码
数据区&#xff1a;存放数据 
动态数据区 
堆&#xff1a;动态内存申请区&#xff0c;malloc/free
栈&#xff1a;局部变量区&#xff0c;系统自动申请自动释放
静态数据区&#xff1a;存放全局变量&#xff0c;静态变量&#xff0c;常量&#xff0c;未初始化的静态数据全部初始化为0
裸机中的应用程序
裸机中的应用程序内存分配都是由编译器和链接配置文件指定的&#xff0c;其可能分为若干个段&#xff0c;包括代码区&#xff0c;堆栈区&#xff0c;数据区&#xff0c;常量区等的大小和地址&#xff0c;链接后各变量和代码的详细内存分配可以查看内存的map文件&#xff08;一般而言都可产生&#xff09;。且代码区和常量区是放在flash的地址空间&#xff01;&#xff01;&#xff01;

注&#xff1a; 
裸机应用与操作系统应用的区别&#xff1a; 
&#xff08;1&#xff09;操作系统上编译连接好的程序&#xff08;如.exe&#xff09;存放在磁盘中&#xff0c;执行时首先将代码复制到内存&#xff08;SDRAM&#xff09;中&#xff0c;然后由操作系统为该应用开辟一个进程&#xff0c;并分配内存。程序中可使用标准C库malloc等动态分配内存的函数 
&#xff08;2&#xff09;裸机上的应用由于没有操作系统的管理&#xff0c;其下载好的代码存放在Flash里&#xff0c;在执行的时候直接从flash里读取命令&#xff08;没有复制到SDRAM这一步&#xff0c;除了中断向量表等对响应速度要求特别高的代码以外&#xff09;。常量也是存在flash里。由于无操作系统&#xff0c;故无法在裸机中正常使用malloc函数。若非要使用malloc也可以&#xff0c;不过需要在使用之前先使用stdlib.h中的以下函数指定动态分配空间的内存位置和大小。

void init_mempool (void _MALLOC_MEM_ *p, unsigned int size);//起始地址和大小
1
不过一般不推荐这样使用&#xff0c;因为采用malloc函数动态申请的时候会产生内存碎片&#xff0c;这对于RAM本来就特别稀缺的单片机来说非常不可取&#xff01;应该是自己写一个动态内存分配的函数&#xff01;&#xff01;&#xff01;
--------------------- 
作者&#xff1a;遍地流金 
来源&#xff1a;CSDN 
原文&#xff1a;https://blog.csdn.net/u012177034/article/details/52299887 
版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请附上博文链接&#xff01;


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
苦--但是依然love着你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有