前言
本系列文章是笔者学习数据结构的笔记,如有不妥之处欢迎指正
目录
静态内存(局部变量)
- 主调函数调用被调函数时,被调函数中申请分配的静态内存仅在被调函数运行时生效,被调函数运行结束之后该内存立即被释放
#include<stdio.h>
int f(int **p);
int main()
{
int *p; //此时仅声明了一个int *类型的指针变量,但是并没有对该变量赋值,此时该指针非法
f(&p); //调用f()函数,此时f()内部申请分配的内存开始生效
//当函数调用结束时,静态分配的内存被释放,指针p又变为非法指向
return 0; //即在被调函数中申请分配的静态内存仅在被调函数运行时有效
//被调函数运行完毕被调函数中申请分配的内存立即被释放
}
int f(int **p) //将主函数中指针的地址传送进来,故使用int **p
{
int s = 3; //在调用该函数时对系统申请分配了一块内存
*p = &s; //此时main()函数中的指针有了指向,main()函数中的指针p指向合法
}
动态内存
- 程序运行时申请分配的动态内存在被释放(free())前一直生效,直到程序结束
- 因此手动分配的内存非必要时必须及时释放否则会造成内存泄漏1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p; //此时仅声明了一个int *类型的指针变量,但是并没有对该变量赋值,此时该指针非
f(&p); //调用f()函数,此时f()内部申请分配的内存开始生效
//当函数调用结束时,因为f()函数中分配的动态内存并没有被释放,因此指针p指向仍然合法
return 0;
}
int f(int **p);
{
*p = (int *)malloc(sizeof(int)); //申请分配动态内存
}
- 综上所述:跨函数使用内存只能通过动态内存实现
指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况,即可用内存越来越少 ↩︎