1、memset函数(初始化内存)
void* _Dst初始化内存是谁
int _val,用什么值来初始化
size_t _Size初始化几个(字节数)
对无符号整型重命名为size_t
2、menset原理
memset(void*初始化内存的指针,int value传入的值,size_t size初始化多少个字节)
申请的空间按照字节为单位,用int value进行初始化
malloc calloc(初始化和memset合二为一)
malloc与memset的使用
3、calloc 函数的使用
所使用的参数一个是个数count一个是字节数
int main()
{
int* p = (int*)malloc(sizeof(int) * 10);
assert(p != NULL);
for (int i = 0; i < 10; i++)
{
printf("%5.1f", p[i]);
}
free(p);
p = NULL;
}
4、ralloc
作用:在堆内存中扩容
注意:realloc的适用范围应与被扩容对象的内存空间相同
int main()
{
int arr[10];//局部变量在栈上申请了十个单元格
realloc();//在堆区,无法进行扩容
}
realloc函数调整内存大小分为3种情况:
IP的指向未发生改变,就是在之前内存不足的地方续上一块内存
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p = NULL;
int *ip = (int*)malloc(sizeof(int)*10);
if(NULL == ip) exit(EXIT_FAILURE);
// 处理程序
ip = (int*)realloc(ip,sizeof(int)*1000);
// realloc 分配失败,返回 NULL ?
if(NULL == ip) exit(EXIT_FAILURE);
//正确处理方法
p = (int*)realloc(ip,sizeof(int)*1000);
if(NULL == p)
{
// 扩充失败,
free(ip);
exit(EXIT_FAILURE);
}
else
{ // free(ip);
ip = p;
// 处理程序
}
free(ip);
ip = NULL;//防止多次释放出现指针崩溃的现象
return 0;
}
5、 练习判断下列代码的对错:
6、因free出现崩溃的情况:
1. int *p=(int *)malloc(100);
free(p);
free(p);//连续多次的释放内存会使程序崩溃
2.free(野指针);
3. int a=0;
int*p=&a;
free(p);//会出现崩溃, a存在栈上 但是free释放的是堆上的内存
所以free必须和malloc calloc realloc dao 搭配使用