前言
本系列文章是笔者学习数据结构的笔记,如有不妥之处欢迎指正
为什么要动态分配内存
- 以数组为例,定义一个含有5个元素的数组的时候,系统会一次分配给程序5个元素的内存空间,但是实际使用不一定会用到全部的5个元素的空间,因此会造成空间浪费。
- 以数组为例,除非关闭并修改程序否则不能改变输入数据的最大组数
- 即不能做到随用随分配,随用随释放,动态内存分配能够解决以上的问题
- 动态内存:程序运行时内存不够可以动态的分配,内存用完后可以动态释放
内存分配与释放的概念
- 内存分配:操作系统将部分内存的使用权限给予程序
- 内存释放:操作系统回收该部分内存的使用权限,但是但是并不会清空内存中的遗留数据
sizeof()函数
- 功能: 计算数据所占空间的字节数(内存大小)
用于数据类型
sizeof(数据类型)
用于变量
sizeof(变量名)
malloc()函数
- 头文件: malloc()函数在stdlib.h这个头文件中,因此在使用前应先在程序中包含该头文件
- 动态分配内存
#include <stdio.h>
#include<stdlib.h>
int main()
{
int len;
int a[5] = {1,2,3,4,5};
scanf("%d",&len); //输入所需元素个数
int *p = (int *)malloc(sizeof(int )*len); //函数前方的(int *)表示强制类型转换
//函数括号中的sizeof(int )*len表示申请的内存的大小,
//其中sizeof()函数返回int型变量所占字节数
//该数与输入的数相乘得到所需的字节数
*p = 5; //等价于a[0] = 5;
p[4] = 1; //等价于a[4] = 1;
printf("%d %d", *p, p[4]);
return 0;
}
对程序输入
5
输出结果为
5 1
- 为何需要强制类型转换
malloc()函数只能返回第一个字节的地址,但是第一个字节的地址没有实际含义(不能确定多少个字节作为一个变量)
free()函数
- 头文件: 同样地free()函数在stdlib.h这个头文件中,因此在使用前应先在程序中包含该头文件
- 动态释放内存
#include <stdio.h>
#include<stdlib.h>
int main()
{
int len = 2;
int *p = (int *)malloc(sizeof(int )*len); //动态分配内存
free(p); //动态释放内存
//把p所代表的动态分配的内存释放
return 0;
}