递归函数 动态内存开辟(函数调用机制)

本文深入探讨了递归函数的工作原理,包括其时间复杂度、退出条件和问题规模的分解与合并。以二分查找为例,展示了递归在算法中的应用。此外,还讲解了动态内存开辟,通过malloc、calloc、realloc和free函数的使用,强调了内存管理的重要性,以及防止内存泄漏的措施。最后,概述了函数调用机制,从栈和堆的内存分配到函数调用过程中的各个步骤,阐述了局部变量的生命周期和现场保护。
摘要由CSDN通过智能技术生成

目录

                递归函数

                动态内存开辟

                函数调用机制 


递归函数

 时间复杂度和递归的深度有关 

1)函数直接或间接调用自己->递归的函数

2)函数退出条件

3)形参体现问题规模,问题规模不断缩小

分解:大规模问题分解为小规模问题直到找到小规模问题能解决

合并:将小问题规模的解逐层组合成原问题规模

举例:1)二分查找

int print(int *arr, int l,int r,int vlan){
		if (l>=r)  return -1;
	int mid=((l-r)>>2)+r;

	if (arr[mid] > vlan)    return print(arr, l, mid-1,vlan);
	if (arr[mid] < vlan)      return print(arr, mid+1, r, vlan);

	if (arr[mid] == vlan)   return mid; 
     return 0;
}
int mun(int* arr, int len, int vlan){
	return print(arr, 0, len - 1, vlan);
}

        2)将一个整数的每位数字输出出来

int point(int num){
	
	  if (num == 0) return 0;
	  printf("%5d",num % 10);
	  point(num/10);//形参体现问题规模不断缩小
}

        3)快速排序


void quick_sort(int* arr, int left, int right){
	int x = arr[left];
	int i = left, j = right;
	while (i < j){
		while (i<j&&x<=arr[j])
			j--;
	        arr[i] = arr[j];
		while (i<j&&x>=arr[i])
			i++;
	        arr[j] = arr[i];
 
	}
	arr[i] = x;
	if (i-1>left)
	quick_sort(arr, left, i - 1);
	if (i + 1 < right)
	quick_sort(arr, i + 1, right);
 
}

动态内存开辟

三个函数  malloc    realloc   calloc  free(释放) 

内存开辟   栈:高地址->低地址

                堆:1.5G~1.9G,动态内存开辟    低地址->高地址 进行内存开辟,程序员开辟,自己释放(防止内存泄漏)。

malloc :例:int *p=(int*)malloc(1.8*1024*1024*1024);malloc(字节数)

int main(){
int a=10;
int*p=(int*)malloc(sizeof(int*)*a);//1)开辟 
assert(p!=NULL);//2)p==NULL 内存开辟失败
for(int i=0;i<n;i++){
printf("%d",p[i]);
}
free(p);//3)释放指向p的内存空间
p=NULL;//4)p=null
return 0;
}

以上代码便是开辟内存定义一个一维数组,等价于c++中定义int p[a];

动态开辟内存的四个步骤:

1)开辟内存

2)断言 p若等于空则说明没有开辟成功,

3)释放内存,

4)p=NULL,防止出现野指针(悬挂指针)8e3b15ae3f9b42afb5ade60c0e2faca5.png

 函数调用机制

        局部变量内存  程序执行过程中“动态”建立和释放。动态->系统自动管理  栈内存 

进行一个函数调用:

1)建立栈帧空间  (注:栈帧 函数的返回地址和函数调用上下文)

2)保护现场:主调函数运行状态  入栈

3)形参进行存储空间开辟,形参  拷贝  实参 ,函数局部变量内存分配

4)执行函数体

5)释放被调函数的栈空间

6)恢复现场:获取主调函数的运行状态,返回主调函数执行的地址

7)继续主调函数的后续语句

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*闲鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值