动态内存分配特点
动态内存是开发者手动分配的, 是堆分配的.
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");
}
运行效果图:
此时为垃圾值