c语言实战开发(别浪费空间)2019-12-07 Day12

本文详细介绍了C语言中的内存管理,包括系统的四个内存空间:栈区、堆区、字符常量区和静态全局区。讲解了动态分配内存、输入输出名字的示例、文件操作以及结构体的使用。特别强调了动态内存分配和释放,以及如何通过文件实现数据的持久化存储。同时,还探讨了结构体的内存对齐和浪费空间的问题。
摘要由CSDN通过智能技术生成

内容

1:系统的四个内存空间
2:动态分配内存
3:demo:输入输出名字
4:文件操作
5:结构体

一.系统的四个内存空间

字符常量区:

特点
①:只能读取,不能修改(只读)
②:空间也是由系统申请释放
③:生命周期中,字符串常量与系统共存亡,而数值常量,比如12,31,'c',等是 立即数存储 放常量,一般不占用额外的存储空间,即拿来主义。比如int a = 12,那12直接就赋给a了,不给12留额外的存储空间
④全局const变量存储在常量区,局部const不存在常量区,而是存在栈区。

静态全局区:全局变量和static变量。

特点:
1:存在静态区/静态全局区/静态存储区
2:会被自动初始化为0
3:生命周期与系统共存亡
4:运行时,在加载资源阶段分配空间。而栈区是相当于执行到int a 才开始分配空间
(1)全局变量/外部变量特点:
①:初始化必须用常量,而不能用abc等变量
②:作用域是所有文件都可见
③:存储类说明符是extern
④:局部位置也能声明全局变量,那这样就不能省略extern
(2)静态全局变量(加extern变成外部的,加static变成静态的)特点:与extern不同,static只在所在文件下有效,别的文件用不了
(3)静态局部变量/局部静态变量特点:
①:生命周期是与程序共存亡,相当于把局部变量的生命周期延长了
②:作用域与局部变量相同
代码示例:
{int a = 1;
static int b = 1;
a++;b++;}
引用三次这个函数,发现每次打印都是a= 2,b = 2/3/4.充分体现了局部变量与静态局部变量的唯一区别:生命周期不同。

栈区:

局部变量。默认1M空间,由系统自动申请自动释放(离开作用域就自动收回)(一般是在花括号内)。默认有auto修饰。

堆区:

自己申请的内存空间。 malloc calloc realloc。必须自己释放,不释放的话也是跟程序共存亡

举例

#include<stdio.h>
//常量字符串的内存空间由系统自动分配
//在常量区里面分配 当程序结束才会被释放 
char* test(){
    char *name = "jack";//变量本身name被释放掉,(这里name是指针而不是字符串名字)但是jack没有释放。也就是说这里的jack是在常量区分配的。
    return name;//注意这里返回name 
}
int main (){
    char *p; 
    p = test();
    printf("%s",p);//注意这里是%s 
    return 0;
}

再次强调:变量本身name被释放掉,(这里name是指针而不是字符串名字)但是jack没有释放。也就是说这里的jack是在常量区分配的。

#include<stdio.h>
char *test1(){
    char name[10] = "jack";//和前一个不同的是,这里过了这个函数之后,里面的内存全部都释放掉了,也就是name里面的所有东西。所以打印出乱码 。也就是说这里的jack是在栈区里面分配的
    return name;
}
int main (){
    char *p; 
    p = test1();
    printf("%s",p);//注意这里是%s 
    return 0;
}

前一个不同的是,这里过了这个函数之后,里面的内存全部都释放掉了,也就是name里面的所有东西。所以打印出乱码 。也就是说这里的jack是在栈区里面分配的

#include<stdio.h>
int count = 0;//当成全局变量,相对于当前文件来说的 
void test3(){
    count++;
    printf("count = %d",count);
}
int main (){
    test3();
    test3();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“如鹏教育”是为计算机、信息等IT类专业在校大学生服务的学习社区。IT行业是一个前景广阔的行业,对人才的需求量非常大,但是与此对应的是在校IT类专业大学生却非常迷茫,他们有着各种各样的困惑: (1)IT类专业好找工作吗?待遇怎么样? (2)现在计算机专业学生那么多,我们会不会找不到工作? (3)培训机构几个月就能培养出一个高薪白领软件工程师,我学四年却什么都不会,是不是上大学浪费了? (4)听说我们专业毕业后可以做软件开发、游戏开发、嵌入式开发、网络管理,我应该学哪个方向? (5)有人说“做软件开发就是吃青春饭,干不到35岁”,是不是35岁以后我就失业了? (6)IT行业的技术发展这么快,是不是我学的很快就会被淘汰?学什么不会被淘汰? (7)这么多技术,我该学什么?我该怎么学? (8)看到招聘启事上都写着要会某某工具、某某语言、某某框架,这什么时候能学完? (9)单位招聘都要两年、三年的工作经验,我还没毕业哪里来的经验呀? (10)像微软、google、百度、IBM等这样的大公司招聘的时候看重什么能力呀? (11)考研还是不考研,谁能告诉我? (12)计算机专业是学好C语言就行了吗?C#、 Java那些东西需不需要学? ………… 大部分同学都在被这些问题迷茫着,因此浪费了大量的时间,也走了很多弯路,这样大部分同学毕业后个人能力根本无法满足企业的要求,这就出现了同学们最害怕的“毕业即失业”!“企业里急需大量才人,应届生找不到工作”是业内一个怪圈,“计算机321”认为要从根本上改变这个怪圈就要从同学们的大学生活的每一天抓起。“大一看清IT行业、对这个行业产生兴趣;大二、大三苦练基本技能、实战本领;大四学习求职技巧 ”是我们运营的宗旨。 我们原创的《C语言也能干大事》、《自己动手写网站》、《学校里教的过时了吗》、《一切语言都是纸老虎》等视频教程已经帮助很多同学走出了困境! 学东西不用东奔西走,在宿舍就能学习,在网上就能与老师互动。让“如鹏”与同学们共成长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值