数据结构入门(五)——预备知识(4)——内存的跨函数使用

前言

本系列文章是笔者学习数据结构的笔记,如有不妥之处欢迎指正



静态内存(局部变量)

  • 主调函数调用被调函数时,被调函数中申请分配的静态内存仅在被调函数运行时生效,被调函数运行结束之后该内存立即被释放
#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));  //申请分配动态内存
}

  • 综上所述:跨函数使用内存只能通过动态内存实现

  1. 指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况,即可用内存越来越少 ↩︎

猜你喜欢

转载自blog.csdn.net/qq_40016124/article/details/113104965