C语言编程入门之内存管理
沉沙 2018-12-21 来源 : 阅读 895 评论 0

摘要:本篇教程探讨了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知识库!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程