C语言,单片机绕不过的坎,你对C语言内存分配了解多少呢

点击蓝字

5484fb18f8ff9f1b2226e94d9372a985.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

一、static在C语言里面可以用来修饰变量,也可以用来修饰函数。

1、 先看用来修饰变量的时候。变量在C语言里面可分为存在全局数据区、栈和堆里。

其实我们平时所说的堆栈是栈而不是堆,不要弄混。

例如:在file.c中
int a ;
int main()
{
int b ;
int *c = (int *)malloc(sizeof(int));
}
a是全局变量,
b是栈变量,
c是堆变量。

2、static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由许多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。

3、static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了上一次被调用后留下的值。

4、static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

例如:
文件a.c
static int i; //只在a文件中用
int j; //在工程里用
static void init() //只在a文件中用
{
}
void callme() //在工程中用
{
static int sum;
}

上面的全局变量i和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme()函数里。变量j和函数callme()的作用域扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。

文件b.c
extern int j; //调用a文件里的
extern void callme(); //调用a文件里的
int main()
{
...
}

而且static会有下面的几个特点:

1、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

2、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

二、局部变量和全局变量

从作用域角度将变量分为局部变量和全局变量。它们采取的存储类别如下:

局部变量:

①自动变量,即动态局部变量(离开函数,值就消失)。
②静态局部变量(离开函数,值仍保留)。
③寄存器变量(离开函数,值就消失)。
④形式参数可以定义为自动变量或寄存器变量。

全局变量:
①静态全局变量(只限本程序文件使用)。
②全局变量(即非静态的全局变量,允许其它程序文件引用)。
从变量存在时间可将变量存储分为动态存储和静态存储。静态存储是在整个程序运行时都存在,而动态存储则是在调用函数时临时分配存储单元。

动态存储:
①自动变量(函数内有效)。
②寄存器变量(函数内有效)。
③形式参数。

静态存储:
①静态局部变量(函数内有效)。
②静态全局变量(本程序文件内有效)。
③全局变量(整个程序可引用)。
从变量存放的位置可将变量存储区分为静态存储区和动态存储区:

静态存储区:
①静态局部变量。
②静态全局变量。
③全局变量(可被同一程序其它文件引用)。

动态存储区:自动变量和形式参数。
CPU寄存器:寄存器变量。
当然,本文讨论的对于变量的内存存储分配只是一部分,在C语言中依然会有其他的存储方式和类型的存在。

b83153c514c8c41dc3e838631284b490.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

setcellvalue 格式_POI对Excel单元格的格式的设置参数

最近在做导出Excel的功能封装,遇到了几个问题:单元格宽度问题数据不是数字格式问题格式化了之后显示的不是数字而是######的问题(其实是因为单元格宽度不够导致的无法显示格式化之后的内容)下面先说说解决方法:1、单元格宽度问题这个问题有两…

内存 增量数据持久_内存中数据模型和大数据持久性

内存 增量数据持久ORM框架在需要与关系数据库进行交互时可以帮助开发人员。 对于关系数据库,有许多出色的ORM框架,例如Hibernate和Apache OpenJPA,其中一些确实很棒。 如今,大数据正在涌现,越来越多的人开发在大数据上…

自学编程的6个技巧总结

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删有一天,我的一个在学编程的朋友问我:“我想快速学习编程,你有什么好的推荐吗?”我曾在上大学的时…

python就业班 miniweb框架_mini-web框架

1. 框架概述web框架是一个为web服务器提供服务的应用程序,专门负责处理用户的动态资源请求.静态资源: 资源的内容是固定不变的.动态资源: 资源的内容是动态变化, 数据是从数据库获取的.静态 web 服务器 使用 tcp 传输数据1. 导包 socket2. 创建一个 socket 对象, socket.socket…

java编写应用程序_为您的Java应用程序编写数据驱动的测试

java编写应用程序JUnit是一个功能非常强大的测试框架,它不仅为其用户提供了编写快速简便的测试的功能,而且还为用户提供了扩展它并使其按其期望的方式工作的机会。 在JUnit之上构建了许多框架,这些框架为目标受众提供了各种易用的功能。 Eas…

C语言如何知自身函数的实际地址与大小

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删事情的起因大概是这样……在很久很久以前,我最早用的是MASM(Win32ASM)写程序,从平台兼容性、开发…

python快速排序算法循环_算法:快速排序的Python实现

一、概述快速排序(quick sort)是一种分治排序算法。该算法首先 选取 一个划分元素(partition element,有时又称为pivot);接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分)、划分元素pivot、right(大于划分元素pivot的部分)&a…

xtext_使用Xtext为Eclipse和IntelliJ开发DSL

xtext在这篇文章中,我们将看到如何开发一种简单的语言。 我们的目标是: 语言的解析器 IntelliJ的编辑器 。 编辑器应具有语法突出显示,验证和自动完成功能 我们还将免费提供Eclipse和Web编辑器的编辑器 ,但请包含您的兴奋之处&…

sed 插入多行_Linux三剑客之sed

sed命令用法小记版本:CentOS7▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼好久没更新文章了,项目的事情太多,总得给自己的懒惰找个借口,哈哈~话不多说进入正题创建测试数据[aliscaspark02 a]$ cat data#test the sedThis is the header l…

分享一些超级炫酷的C语言小技巧

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些非常…

使用Apache Cassandra设置SpringData项目

在这篇文章中,我们将使用Gradle和spring boot来创建一个集成spring-mvc和Apache Cassandra数据库的项目。 首先,我们将从Gradle配置开始 group com.gkatzioura version 1.0-SNAPSHOTapply plugin: java apply plugin: eclipse apply plugin: idea appl…

优朋普乐大数据_优朋普乐邵以丁:用大数据全面洞察需求

优朋普乐创始人、董事长兼CEO邵以丁回顾优朋普乐十二年发展历程,数次强调是多年来积累的大数据给优朋普乐的业务拓展指明了方向,有的放矢的决策让企业对未来发展充满信心。大数据为及时发现甚至准确预测消费需求提供了新途径,因为基于相关的大…

C++编程新手容易犯的 10 种编程错误

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删公司每年都会有一定的人员流动,相应地也会招一些应届生补充进来,指导应届生已经成为老员工的必修课了。平日里会我们会经…

drill apache_Apache Drill:如何创建新功能?

drill apacheApache Drill允许用户使用ANSI SQL探索任何类型的数据。 这很棒,但是Drill的作用远远不止于此,它允许您创建自定义函数来扩展查询引擎。 这些自定义函数具有Drill基本操作的所有性能,但是允许执行这些性能会使编写这些函数的技巧…

python往npy写入数据_Python 存取npy格式数据实例

数据处理的时候主要通过两个函数(1):np.save(“test.npy”,数据结构) ----存数据(2):data np.load(test.npy") ----取数据给2个例子如下(存列表)1、z [[[1, 2, 3], [w]], [[1, 2, 3], [w]]]np.save(test.npy, z)x np.load(test.npy) x:->array([[list([1,…

Linux上C语言程序编译过程详解

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删本文将介绍如何将高层的C/C语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:预处理(P…

hibernate 别名_Hibernate:在sqlRestriction上使用联接表别名

hibernate 别名如果在复杂查询的情况下使用Hibernate模式,则需要使用sql。 因此,sqlRestrictions可以解决。 但是,对联接表别名使用sql限制有点棘手。 将有三个表: 公司表。 员工表。 每个员工都属于一个公司,因此…

C语言,动图展示十大经典排序算法

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,…

python求偏度系数_用 Python 讲解偏度和峰度

之前笔者在做一个金融数据项目时,有朋友问我,衡量股票收益率有没有什么好的方法。这个问题让笔者也思索了好久,其实股票的收益率如果我们从本质来看不就是数据吗,无非就是收益率我们就想让其越高越好,也就是让这个数据增加得越多越好。而衡量数据我们经常用到的方法有均值…

java ee各类组件_在Java EE组件中使用骆驼路线

java ee各类组件从现在开始我一直在与Camel合作,我真的很喜欢它的简单性。 在Java EE之上使用它一直是一个挑战,我最近发表了一篇关于如何做到这一点的演讲,而在Java EE中引导Camel的不同方法实际上建议使用WildFly-Camel Subsystem 。 在正在…