C语言如何向系统接要存
C语言如何向系统接要存,就有这么三种方式:
1、向栈要。
2、向堆要。
3、向数据段要。
这一下就扯出了三种内存空间,内存空间的本质是一样的,一个地址对应一个方框,方框里可以放数据。但是为了更好的去
管理这篇空间,于是将空间分成了几个不同的区域,这些区域有:
1、栈:存放局部变量。
2、堆:存放malloc分配的变量。
3、数据段,如果数据段继续进行细分,还可以分为:
3.1 .data 段 放置初值不为0的全局变量。
3.2 .bss 段 放置初值为0,或者没赋初值的全局变量。(他们的结果是一样的,初值为0,应为.bss会被编译器清理)
4、代码段:代码段是存放(能够改变的变量之外的东西)代码的,虽然也是在内存中,但是是只读的,程序员无法去修改它。
所以在讲向系统要内存时,我并没有说到这个内存区域。
//--栈
那我们就一个个的说,先说栈,这片区域是有栈管理器来管理的(栈管理器其实就是一种算法,一段代码)。当我们
申请局部变量的时候,其实就是在向栈要内存。使用栈的好处是,自动化管理,使用方便。由于分配的空间是连续的,
所以管理起来也比较方便,用起来效率也比较高。(相对于堆)。
//--堆
再看堆,堆也是一片内存空间,由堆管理器掌管。C语言中用malloc分配的变量空间,就会到堆上。但分配的空间不一定是
连续的,这是为了解决栈的一个缺点——应为栈分配空间是连续的,而且有需要被反复使用,这样会造成空间碎片无法利用。
而堆管理器使用链表的方式解决了这个问题,可以充分的利益空间,缺点当然就是使用起来没那么方便,而且效率也没有栈高。
但是,从堆和栈的空间大小来看,此时效率的这点差异,远没有空间利用率的价值大。堆这块内存区域往往比栈这块内存区域大很多。
这也是为什么,在申请一个很大的内存空间时,需要在堆上,而不是栈上。
//--数据段
数据段是存放全局变量的。细分可以分为.data和 .bss 这个已经说过了。
数据段,是由谁管理的? 堆有堆管理器,栈有栈管理器。数据段呢? 这个问题,我不清楚~~
有一个说法是:数据段可读可写不可执行,这个我也似懂非懂~~
反正数据段是放全局变量的,多的我也不懂,就说这么多。
//--代码段
最后看代码段,代码段的特点是放一些我们改不了的东西,如程序代码等。所以上图中,说他可读,可执行,但是不可写。
代码段朱老师讲的很清楚了,我就直接摘录笔记了:
/*******************************************************************************
代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
4.5.4.2、有些特殊数据会被放到代码段
(1)C语言中使用char *p = "linux";定义字符串时,字符串"linux"实际被分配在代码段,
也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。
(2)const型常量:C语言中const关键字用来定义常量,常量就是不能被改变的量。
const的实现方法至少有2种:第一种就是编译将const修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器);
第二种就是由编译器来检查以确保const型的常量不会被修改,实际上const型的常量还是和普通变量一样放在数据段的(gcc中就是这样实现的)。
/*******************************************************************************
这里就说下我的理解:
1、有些时候常量会被直接放到代码段,这样程序员就无法修改了。如字符串它就是个常量,他就是被放到代码段,
你程序员是无法修改它的。修改了运行时就会报段错误!(注意这里编译不会报错,如果写成const char *p = "linux",编译时就会报错
所以明显这么写更好!)
2、有的变量本身不是常量,但是加上const修饰后就变成常量了。如果编译器吧const修饰的变量都丢到代码段,程序员当然
就无法修改,但是GCC不是这么做的,他并没有将const修饰的变量放到代码段。所以const修饰的变量不是不能被修改,只是不能
直接被修改。如用指针可以间接修改。不过编译器会警告。GCC的做法就是——警告你不要跳楼,但是你非要调,我也不拦你。。。
那么,这四个区域就讲完了。现在就讨论下数据段中的全局变量和堆中的变量有什么区别:
1、生命周期不同
“堆内存的生命周期是从malloc开始到free结束,而全局变量是从整个程序一开始执行就开始,
直到整个程序结束才会消灭,伴随程序运行的一生。”——引用朱友鹏笔记
2、用法不同。
数据段上的全局变量,是在程序编译的时候就确定了,程序结束才会释放。程序运行时大小是不可更改的。所以数据段也通常被称为静态区域。
而堆上的变量是程序运行才分配的(C语言通过函数malloc分配),也觉是说它是动态的,说白了就是malloc里可以放一个变量,
达到根据程序运行的情况,起到一个随机应变的效果。
3、大小不同
我想堆的区域应该比数据段大很多。
总结:
1、分析了半天也就是堆的好处最多,但是还没说他的使用方法,那就简单演示下:
char *p = (char *)malloc(10);
if (NULL == p)
{
printf("malloc error.\n");
return -1;
}
memset(p, 0, 10); // 第三种方法: 放在malloc申请的堆内存中
strcpy(p, "linux");
2、至于数据段的管理,确实不是很清楚,只知道通过全局指针访问(全局指针,ARM中就是PC指针)。(内心语:全局指针访问全局变量
这也是挺匹配的哈!栈有栈指针,堆有链表,有意思。)
3、现在不明白的东西,也不要太纠结,现在实在弄不懂就先放着,说明自己还没到那个程度
不要忘记自己的学习主线才是最重要的,所以说不求甚解也是一种智慧~~!!
C语言如何向系统接要存的更多相关文章
- 浩瀚技术团队... 安卓智能POS移动PDA开单器 开单器 进销存系统 进销存系统
浩瀚技术团队... 智能POS移动PDA开单器 开单器 进销存系统 进销存系统 点餐 会员管理 会员管理 深度解读 手机APP移动办公到底是什么? 快速打单POS·不仅仅是快那么简单!
- C语言操作WINDOWS系统存储区数字证书相关函数详解及实例
C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...
- Office 2010 安装程序包的语言不受系统支持
主要看了这篇文章之后让我有了处理思路. 最后我直接用压缩文件进行安装,没有时行解压.这样就不会出现找不到什么文件的问题了.所以语言不受系统支持问题也就解决了. 原文内容: 前几天,有位好友跟我说他的 ...
- 干货 | 携程多语言平台-Shark系统的高可用演进之路
https://mp.weixin.qq.com/s/cycZslUlfyVNm2GVrZm1Cw 干货 | 携程多语言平台-Shark系统的高可用演进之路 原创 Fenlon 携程技术 2020-1 ...
- 列出系统上的存储库,状态是enabled [root@blog ~]# dnf repolist
DNF 和 YUM 均是 rpm 软件包管理工具,但是 DFN 替代 YUM 的说法由来已久,因为 YUM 包管理工具有一些问题长期得不到解决. 这些问题包括性能低下.内存占用高以及依赖包解决方案不佳 ...
- C语言中的系统时间结构体类型
在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:0 ...
- 如何为C语言添加一个对象系统
为C语言添加OO能力的尝试从上世纪70年代到现在一直没有停止过,除了大获成的C++/Objective-C以外,还有很多其它的成功案例,比如GTK在libg中实现了一个对象系统,还有前几年一个OOC, ...
- Centos系统各种日志存详解
Centos系统各种日志存储路径和详细介绍 Linux常见的日志文件详述如下 1./var/log/boot.log(自检过程) 2./var/log/cron (crontab守护进程crond所派 ...
- C语言 · 成绩查询系统
抱歉,昨天忘了往博客上更新,今天补上. 成绩查询系统 分值: 21 数学老师小y 想写一个成绩查询系统,包含如下指令: insert [name] [score],向系统中插入一条信息,表示名字为na ...
随机推荐
- 免费的局域网协作办公方式—onlyoffice文档协作
局域网内想享受协作办公的乐趣,请移步到这里按照步骤部署.https://blog.csdn.net/hotqin888/article/details/79337881 它是免费开源的,经过作者的一些 ...
- [Android] 实现简单的相机程序
好久没写了,有些东西做过都快忘了,赶紧记一下. 现在来实现一个简单的相机程序. 原文地址http://www.cnblogs.com/rossoneri/p/4246134.html 当然需要的话可以 ...
- chrome中workspace配置达到同步修改本地文件的作用
在前端开发中,我们经常需要在浏览器中进行调试,特别是一些样式的修改,如果你还是先在浏览器elements中调试好在复制到本地文件,那就真的out了. chrome浏览器的workspace功能完全可以 ...
- 使用redis 处理高并发场景
1.原理: 当同一个用户获取锁之后,会让该用户一直持有锁.同样 的用户再次获取,会根据原子性 ,lock返回true. /** * 获取锁(非公平锁), 默认获取超时为2分钟 */ public bo ...
- python的函数(二)
1,函数的变量 2,函数的返回值 1,函数的变量 1.0,函数的变量分为局部变量和全局变量. def fun(): x = 100 print x 这个x是局部变量,函数执行完后,x的变量就会销毁,只 ...
- SqlServer为字段创建索引
语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名) 创建索引实例: 聚簇索引 create clustered index index_name on table_name (c ...
- myeclipse配置jboss
一 相关软件准备 jdk1.6 Myeclipse jboss 6.1 下载地址:http://www.jboss.org/jbossas/downloads/二 安装 下载完jboss ...
- Window10 Linux子系统挂载磁盘
默认情况下, Linux子系统将当前winodws磁盘的盘全部挂载到/mnt/<disk_label>, 但一些新增的盘就需要手动做下了.. 官方参考文档 挂载磁盘 -- DrvFs 挂载 ...
- 快速开发QCombox以及业务样式自定义
这是我在项目实战中的个人总结,写的仓促,有些东西也不一定准确,有些是自己推断的,还希望各位多多指教,多多评论. 关于QCombox如果不需要自定义,其实写UI是很简单的. 创建实例:QComboBox ...
- Azure IoT 预配置解决方案
Azure IoT 预配置解决方案 Sangyu Li © 2018 一.什么是Azure IoT 预配置解决方案? 如图,这就是Azure IoT Suite中 Provision solutio ...