动态内存的作用
在开发中根据实际需求开辟内存
内存申请分类
静态内存申请(静态分配)
1,在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式,如int a[10];
2,必须事先知道所需空间的大小
3,分配在栈区或全局变量区,一般以数组形式
4,按计划分配
特点:在程序运行中无法对其分配的内存进行修改
动态内存申请(动态分配)
1,在程序运行过程中,根据需要的大小自由分配所需空间
2,按需分配
3,分配在堆区,一般使用特定的函数进行分配
特点:在程序运行中可以使用函数对其内存进行动态分配
动态分配函数
注意:
以下函数由系统提供,属于库函数
意味着无需自己定义该函数,直接调用即可
因为动态内存分配的内存在堆区,无法自动释放内存,需要手动释放内存
memset
作用:将指定开始位置到指定长度的内存中的内容设置为指定值
语法:
void *memset(void *s,int c,size_t n);
参数:
void *s:开始位置
int c:指定的内容
n:设定的长度
返回值:
设置的内存的首地址
所属头文件:
#include <string.h>
如:
#include <stdio.h>
#include <string.h>int main() {
char str[10];
// 使用memset将字符数组str中的每个元素都设置为字符 'A'
memset(str, 'A', sizeof(str));
// 输出字符数组,此时应该看到10个 'A' 组成的字符串(注意,不是标准字符串,因为没手动添加'\0')
printf("%s\n", str);
return 0;
}
free
作用:释放动态分配申请的内存
语法:
void free(void *ptr);
参数:
void *ptr:要释放的内存的首地址
返回值:
void:没有返回值
所属头文件:
#include <stdlib.h>
malloc
作用:堆区动态申请内存
语法:
void *malloc(size_t size);
参数:
size_t size:申请的内存大小,单位字节
返回值:
void*:申请的内存的首地址,如果NULL说明申请失败
所属头文件:
#include<stdlib.h>
如:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int len=0;
printf("请输入存储个数\n");
scanf("%d",&len);
//申请空间
void *nums=malloc(len * sizeof(int));
if(nums==NULL)
{
printf("申请失败\n");
return 0;
}
int *p=(int *) nums;
for(int i=0;i<len;i++)
{
printf("%d\n",p[i]);
}
//释放空间
free(p);
return 0;
}
//由于之前并没有对申请到的内存空间进行初始化赋值操作,所以打印出来的将是内存中对应位置上的随机值
calloc
作用:堆区动态申请内存
语法:
void *calloc(size_t nmemb,size_t size);
参数:
nmemb:申请的内存块数
size:每块所占的字节数
返回值:
void*:申请的内存的首地址,如果为NULL说明申请失败
所属头文件:
#include<stdlib.h>
如:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int len=0;
printf("请输入存储的个数\n");
scanf("%d",&len);
int *nums=(int*)(calloc(len,sizeof(int)));
if(nums==NULL)
{
printf("申请失败\n");
return 0;
}
for(int i=0;i<len;i++)
{
printf("%d\n",nums[i]);
}
//释放空间
free(nums);
return 0;
}
malloc与calloc的区别
malloc与calloc函数都是用来申请内存的
区别:
1,函数名不同
2,参数个数不同
3,malloc函数申请的内存,内存中存放的内容是随机值,calloc函数申请的内存中的内容为0
realloc
作用:用于对先前通过
malloc
、calloc
或realloc
分配的内存块进行大小调整,可按需扩展、缩小或重新分配内存语法:
void *realloc(void *ptr,size_t size);
参数:
void *ptr:要追加的内存的首地址
size:重新申请的大小,单位字节
返回值:
void *:追加的内存的首地址,如果为NULL说明追加失败
头文件:
#include<stdlib.h>
内存泄漏
概念:内存泄漏是指申请的空间,没有被指向,系统无法回收该空间。或程序运行中动态分配的内存使用完未释放,使内存持续被占,可能耗尽系统可用内存。
产生原因
1,指向堆区的指针变量,指向了别的地方
int *nums=calloc(10,4);
int a=10;
nums=&a;
2,指向堆区的指针变量 被意外释放
void fun()
{
int *p=calloc(10,4);
}
int main()
{fun();
return 0;
}
总之:
使用完记得释放内存
注意:
重复释放同一片内存会导致程序出现问题
如何避免重复内存释放
在使用申请的内存后要释放并将原指针指向 NULL 每次释放前判断该指针是否为 NULL, 如果不为空在释放并制NULL
如: #include <stdio.h>标签:NULL,int,void,申请,C语言,内存,动态内存,include,size From: https://blog.csdn.net/m0_75253775/article/details/143759932
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char *p = malloc(100);
if(p != NULL){
free(p);
p = NULL;
}
if(p != NULL)
{
free(p);
p = NULL;
}
return 0;
}