内存编程 c语言 c,C语言编程入门之内存管理
本篇教程探讨了C语言编程入门之内存管理,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。
<
自动变量与静态变量
auto自动变量
auto是默认的关键字,如实际中int a,实际为auto int a,{}内部的都是auto变量,不用为此类变量申请或者释放空间,它都是自动完成的。
register 变量
例:register int a = 0;
要使用register变量必须使用此关键字。
static 静态变量
内存位置在程序执行期间一直不改变,一个代码的内部静态变量只能被这个代码块内部访问,函数里使用加载到内存时只会初始化一次,每次访问该函数时不会再初始化。
例:static int b = 0;
全局变量与静态变量
全局变量的存储方式与静态变量相同,可以被多个文件访问,在{}之外的变量。
例:
1 //main.c
2
3 int a = 0;
4
5 Void main{}
6
7 // main1.c
8
9 extern int a;
10
11 Test(){
12 a…….}
静态全局变量:只能在定义它的文件内部访问,在其它文件外部是不可以被访问的。
对于函数在存在静态函数,表示该函数也只能在文件内部访问,不可以在文件外部访问。如果一个代码块之外的函数或者变量,C语言都默认是全局的,可以在其它文件被访问,除非有关键字static,静态函数始终在代码区,static只表示它对外部是否可见。
例:static void test()
内存布局
代码区
程序被操作系统加载到内存的时候,所有的可执行代码都被加载到代码区,也叫代码段,这块内存在运行期间是不可以被修改的,只可以被执行。
静态区
所有的静态变量和全局变量都被放到了静态区,程序退出的时候消失,在运行期间都占用内存。
栈区
所有的自动变量,函数的形参、返回值都是自动放入栈中,当一个变量超出其作用域时,自动从栈中弹出,不同系统的栈大小是不同的,windows操作系统是栈大小是可以设置的。C语言的形参是从左到右入栈的。
堆区
堆是一个大容器,它的容量远远大于栈,操作也更加复杂。堆中分配的内存不会自动释放,需要用free手动释放。一个程序的栈大小是有限的, 一个数组太大有可能导致栈溢出,不要在栈里面定义太大的数组。如果使用一个特别大的数组,那么使用堆而不是栈;如果一个数组在定义时不确定大小,那么适合使用堆,不适用栈。Malloc如果分配内存不释放,就会造成内存泄漏。Windows操作系统堆每次分配的空间是4k,4K为一页,优点不用频繁调度资源,缺点是可能浪费了内存。
void *malloc(int size_t);
例:char* =malloc(10);
Malloc分配空间的初始值是不固定的。
函数返回一个指针
1 //例1:
2 int *test(){
3 Int *p = malloc(1*sizeof(int));//函数不能直接返回一个auto类型的地址
4 *p = 10;
5 Return p;
6 }
7 // 例2:
8 const char *test(){
9 Const char *s = “hello”;
10 Return s;//意思是将s指向一个常量地址,常量在程序运行期间一直都是有效的。常量区和静态区是有效的,程序运行期间一直有效,但是常量区是只读的空间。
11 }
12
13 //例3:
14 const char *test(){
15 Return“hello world”;
16 }
堆空间实现动态大小变化的字符数组
1 //例:
2 char a[] = “asfsb”;
3
4 char b[] = “jhansdnfsdg”
5
6 char *p = malloc(strlen(a)+strlen(b)+1);
7
8 strcpy(p,a);
9
10 strcat(p,b);
calloc与realloc的使用
Void *calloc(size_t nmemb, size_t size)
Malloc的参数是指定分配的大小,单位是字节。
Calloc第一个参数是指定单位的数量,第二个参数指定一个单位的大小。
例:用malloc分配10个int
Int *p = malloc(10*sizeof(int));
用calloc分配10个int
Int *p = malloc(10,sizeof(int));
以上两种写法分配堆空间的大小是一样的,malloc只负责分配空间大小,用memset负责清空;Calloc负责分配空间大小,同时负责将空间分配。
Void *realloc(void *ptr, size_t size)
Realloc在已分配的空间基础上,重新扩大或缩小这块空间。用realloc分配的空间也不会将新改变的空间清空。
通过指针形参分配内存的说明
//例:
void test(char *s){
s =calloc(10,1);
strcpy(s,”hello”);
}//错误
void test(char **s){
*s =calloc(10,1);
strcpy(*s,”hello”);
}//正确
当你想内部给形参分配空间时,形参一定是个二级指针。
本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!
内存编程 c语言 c,C语言编程入门之内存管理相关推荐
- C语言编程宏定义的优缺点,C语言重要知识点总结(二)--内存结构、函数调用过程(栈帧)、宏的优缺点以及##和#的使用...
一.内存结构 内存大致可以分为四个部分:代码段,静态存储区,堆,栈. 具体划分如下图所示: 栈:在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束后会自动释放内存.栈内存的分配运算 ...
- C语言与OpenCL的编程示例比较
C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...
- 使用Keil语言的嵌入式C编程教程(上)
使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...
- c语言是函数式原型的编程,编程范式|程序世界里的编程范式,探索编程本质
最近看了一些关于编程范式的文章,简要做一些小结和记录 什么是编程范式 在现实生活中,为了适配各种规格的螺帽,我们需要许多种类的螺丝刀. 在编程世界中,静态语言有许多种类的数据类型. 不过,我们可以发现 ...
- 自学编程是从python语言还是c语言开始-非计算机专业大学生想自学编程应该学C语言还是学Python?...
之前总结的文章,分享过来,希望对你有帮助.windliang:到底学哪一门编程语言zhuanlan.zhihu.com 发展进程 学哪一门编程语言,我们不妨先梳理一下语言的发展过程. 机器语言 计算 ...
- 混合编程黑科技:跨语言编程问题迎刃而解的3个要点
首先,混合编程是什么鬼? 这个世界上编程语言真不少,光常用就有:C.C++.Java.C#.Objective-C.Javascript.Python.Lua.Swift等等等,遑论一些专业性比较强的 ...
- C语言代码规范(编程规范)
首页 > 编程笔记 > C语言笔记 阅读:7,165 C语言代码规范(编程规范) C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学:一 ...
- 一起学习C语言:初步进入编程世界(三)
上一篇<一起学习C语言:初步进入编程世界(二)>中,我们了解了C语言的加法运算方式和赋值运算符的用法,并通过printf函数成功输出计算结果.私下我们可以参考赋值运算表,练习更多的运算符用 ...
- GO语言-第二节-顺序编程
目录 2.1变量 2.1.1变量声明 2.1.2 变量初始化 2.1.3 变量赋值 2.1.4 匿名变量 2.2 常量 2.2.1 字面常量 2.2.2 常量定义 2.2.3 预定义常量 2.2.4 ...
最新文章
- C#控制远程计算机的服务
- R语言数据结构之数组
- Jquery-core.holdReady()
- Steps to configure Oracle 11g Data Guard Physical Standby – Active Data Guard Part-I
- 函数计算帮助石墨文档突破性能瓶颈,有效节省服务器成本
- leetcode —— 238. 除自身以外数组的乘积
- 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(4)
- 一窥 ARM 的 AI 处理器
- 来鹅厂干大事!腾讯广告技术类岗位高能来袭~
- mysql重置root密码centos_Centos7重置Mysql 8.0.1 root 密码
- 2019-2020-1 20175313 《信息安全系统设计基础》第二周学习总结
- Zemax简单透镜的设计与优化
- 极客云原生营-云原生知识
- 折线统计html,canvas制作简单的HTML图表,折线或者矩形统计(原创)
- 高峰论坛:专家热议物联网行业如何迎风飞扬
- S7-300 PLC的一次系统故障
- 性能测试理论(一)之性能测试方法与流程
- 【audio】耳机插拔/线控按键识别流程
- EfficientNet迁移学习(四) —— 损失函数解析
- 计算机网络笔记——概述、物理层、链路层(方老师408课程)