c语言笔记 存储期
目录
基本概念
自动存储期
静态存储期
自定义存储期
基本概念
在c语言中变量是有生存周期的,一个变量向系统申请内存就是变量的诞生,到内存被释放。这个从诞生到释放的过程就是生命周期。
根据定义的不同我们分为三种生命周期的情况:
- 自动存储期
- 静态存储期
- 静态存储期

自动存储期
知识:自动存储期是指在栈内存中的变量,这些变量不需要我们开发者去担心内存的问题,因为在栈内存中是会被系统释放的,也就是说在{}内生效,出{}外内存就会被系统自动回收,在变量定义处分配空间,出了作用域就被系统释放。
下面三种概念是等价的:
- 自动变量:在存储期角度上,描述变量的时间性
- 临时变量:同上
- 局部变量:在作用域角度上,描述变量的空间性
静态存储期
知识: 静态存储期是值在数据段中分配的变量,也称为静态变量。这一类的变量生命周期比较长,会跟着程序结束而释放,不会在程序运行时候被系统自动释放,生命周期是恒定的,跟谁着整个程序。
注意:
1.被static修饰的局部或者全局变量 具有静态存储期
2.全局变量都具有静态存储期
被static修饰的变量 不是说不能修改值,而是它的内存存储不会变。
关于static修饰需要注意以下几点:
- 被static修饰的变量,如果没有初始化就会默认值为0;
- 被static修饰修饰的全局变量会变成仅本文见;
- 被statici修饰的局部变量会从栈内存移动到数据段;
- 被static修饰的局部变量会变成静态数据,跟随着整个程序吗,随着程序的结束而被释放;
- 被static修饰的局部变量只会初始化一次,下次运行时候会变成修改后的值;
- static修饰的变量不会消失,但是不能在其他函数内使用,可以通过指针去访问;
如果一个变量被static修饰,并且是在函数内部定义的,那么它的作用域仅限于该函数内部。其他函数不能直接访问这个变量,虽然其他函数不能直接访问static修饰的变量,但如果通过指针传递该变量的地址,其他函数可以通过指针间接访问该变量。在C语言中,static修饰的变量的生命周期是整个程序的运行期间。即使函数执行完毕,静态变量的值仍然存在,直到程序结束。
自定义存储期
相比于上面的两类存储期,一种是由系统自动释放,在{}内分配,出{}被释放;一种是跟随着程序的结束而消失,那么对于这些不能控制的生命周期,我们自定义存储期是可以控制变量的生命周期的,申请一块内存和释放一块内存都是由开发者决定,那么我们就要用到自定义存储期。
分配在堆内存,堆空间内的变量是具有自定义存储期的。
相关的API:相关函数使用笔记的知识在我的文章
《c语言笔记 推内存管理》https://blog.csdn.net/2201_75840339/article/details/146212884?fromshare=blogdetail&sharetype=blogdetail&sharerId=146212884&sharerefer=PC&sharesource=2201_75840339&sharefrom=from_link
- malloc函数;
- calloc函数;
- bzero函数;
- free函数;
字符串函数的头文件都是#include
注意:
1.如果说我分配变量到堆内存,然后我不释放它,那么它是跟谁着整个程序的结束而结束;
2.使用malloc函数后,申请的内存初始化值是随机的;
3.使用calloc函数后,申请的内存初始化是0;
4.free函数只能释放堆内存的空间,不能释放其他内存区域;
5.free函数释放后,原先的指针依旧指向这块空间,会变成野指针所以必须要置空;
6.free函数释放后,里面的数值是不会改变,仅仅是该内存被系统回收;
- 释放内存并不会对内存做任何修改,更不会将内存清零。
