手把手入门C语言—动态内存分配

动态内存分配特点

动态内存是开发者手动分配的, 是堆分配的.

malloc(int)函数:返回一个一级指针的地址

malloc(int)函数 是手动申请的一个空间,所以会有没有释放的问题

在main方法写个变量int*p,在func方法赋值

#include <stdio.h>
#include <stdlib.h>

// 在main方法写个变量int*p,在func方法赋值
 
/**
  动态内存分配 
  
*/

// 把一级指针传递过去,二级指针能够接收一级指针的地址 
// 给一级指针赋值,赋值的是一个内存地址值(*address = 地址;) 
void func(int** address){
	
	int i = 100;
	
	// 因为 malloc(int)返回的是内存地址,所以用定义一个指针接收
	int* temp; 
	
	// malloc(int)—返回的是内存地址(申请一块空间)
	temp = malloc(sizeof(int)); // 申请指针的长度(因为指针存放内存地址) 

	// 把 i 对应的值,赋值给 temp 地址对应的值(就是指temp这个指针变量对应的地址对应的值修改成 100 ) 
	*temp = i;
	
	// 把 address 对应的地址对应的值修改成 temp
	//(temp为内存地址,因为 address 是二级指针,二级指针前面加一个 * 为取 1级指针地址,1级指针地址修改成 temp地址) 
	*address = temp;
}
main(){
	
	// 在一个方法中对 iPoint 进行赋值(要对其赋值要传内存地址) 
	// 定义int类型的一级指针变量  iPoint
	int* iPoint; // iPoint 此时没有存放值 
	
	// 把一级指针传递过去,二级指针能够接收一级指针的地址 
	func(&iPoint);
	printf("*iPoint=%d\n",*iPoint);
	printf("*iPoint=%d\n",*iPoint);
	printf("*iPoint=%d\n",*iPoint);
	
	
	system("pause");
}

运行结果:
在这里插入图片描述
打印三次都是 100 所以没有被回收

画图分析

静态内存分配

静态内存分配

动态内存分配

执行到 int* temp时的内存分析
在这里插入图片描述

malloc(sizeof(int))执行过后在堆里面开辟一个新的空间,这个空间大小是 4个字节,开辟的空间一定有内存地址(5000H),把这个内存地址赋值给 temp
temp = malloc(sizeof(int));(把这个内存地址赋值给 temp)
在这里插入图片描述

temp指的是 5000H这个地址
在这里插入图片描述
把5000H这个地址的值修改为100
在这里插入图片描述
执行==完
temp=i后==的内存分析图
在这里插入图片描述

执行 *address = temp; 代码时
*address:*address的内容地址(1000H)对应的值( iPoint 的值)修改为 temp
在这里插入图片描述
temp对应的值为5000H
在这里插入图片描述

当执行完 func 函数时, func 函数被系统回收掉了,但是堆内存会一直存在,所以打印会一直是 100
在这里插入图片描述

再次分析回收时的情况:
第一次取值(此时 iPoint 的内容地址为5000H了,不为空了),首先先去找到 temp ,在找到堆内存中的 100
在这里插入图片描述
如果系统回收过后,就根据内容地址(5000H)去取值
在这里插入图片描述

回收内存

因为 malloc(int)函数 是手动申请的一个空间,所以会有没有释放的问题,所以要使用 free回收内存

// 对 malloc 申请的空间进行回收
free(temp);

#include <stdio.h>
#include <stdlib.h>

// 在main方法写个变量int*p,在func方法赋值
 
/**
  动态内存分配 
  
*/

// 把一级指针传递过去,二级指针能够接收一级指针的地址 
// 给一级指针赋值,赋值的是一个内存地址值(*address = 地址;) 
void func(int** address){
	
	int i = 100;
	
	// 因为 malloc(int)返回的是内存地址,所以用定义一个指针接收
	int* temp; 
	
	// malloc(int)—返回的是内存地址(申请一块空间)
	temp = malloc(sizeof(int)); // 申请指针的长度(因为指针存放内存地址) 

	// 把 i 对应的值,赋值给 temp 地址对应的值(就是指temp这个指针变量对应的地址对应的值修改成 100 ) 
	*temp = i;
	
	// 把 address 对应的地址对应的值修改成 temp
	//(temp为内存地址,因为 address 是二级指针,二级指针前面加一个 * 为取 1级指针地址,1级指针地址修改成 temp地址) 
	*address = temp;
	
	// 对 malloc 申请的空间进行回收,因为申请的是 temp ,所以回收的是 temp 
	free(temp); 
}
main(){
	
	// 在一个方法中对 iPoint 进行赋值(要对其赋值要传内存地址) 
	// 定义int类型的一级指针变量  iPoint
	int* iPoint; // iPoint 此时没有存放值 
	
	// 把一级指针传递过去,二级指针能够接收一级指针的地址 
	func(&iPoint);
	printf("*iPoint=%d\n",*iPoint);
	printf("*iPoint=%d\n",*iPoint);
	printf("*iPoint=%d\n",*iPoint);
	
	
	system("pause");
}

运行效果图:
在这里插入图片描述
此时为垃圾值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值