内容
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是在常量区分配的。
![](https://i-blog.csdnimg.cn/blog_migrate/9db5348d0de915607df6007c8e5251df.png)
#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是在栈区里面分配的
![](https://i-blog.csdnimg.cn/blog_migrate/dd9c24cbf5a060fb8d6d8d78b552ab68.png)
#include<stdio.h>
int count = 0;//当成全局变量,相对于当前文件来说的
void test3(){
count++;
printf("count = %d",count);
}
int main (){
test3();
test3();
return 0;
}