1.malloc值
//1.malloc--开辟好的空间如果还没有使用,则都默认为随机值
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
//向堆区内存申请开辟是个整型内存的空间,开辟的空间首地址交给指针p
//int* p = (int*)malloc(10*sizeof(int));
int* p = (int*)malloc(40);//malloc和free要成对使用
if (p == NULL)
{
printf("%s",strerror(errno));
//如果malloc失败就把失败原因显示出来
}
else
{
for (int i = 0; i < 10; i++)
{
*(p + i) = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
free(p);//把p指向的空间释放掉
p = NULL;//把p指向的地址之间联系断掉--否则可能会内存泄露
return 0;
}
2.free释放不需要占用的动态内存,要和malloc搭配使用
3.calloc
calloc--在堆区开辟的空间默认值为0 ,当空间不足开辟时,将会返回一个NULL;
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
int *p=(int *)calloc(10, sizeof(int));
if (p == NULL)
{
printf("%s", strerror(errno));
//如果calloc失败就把失败原因显示出来
}
for (int i = 0; i < 10; i++)
{
printf("%d ",*(p+i));//开辟后所有内容初始化为0
}
free(p);
p = NULL;
return 0;
}
4.realloc
realloc是在malloc和calloc开辟空间后不足情况下继续开辟一块空间
开辟空间有3种情况:
1.如果p指向的空间之后没有足够的内存可以追加,则直接追加,后返回p
2.当p指向的空间不满足追加,则realloc函数会重新找一个新的内存区域
开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址
3.开辟新的空间失败,返回NULL,会把原来的空间地址也搞丢(得用新的指针来接受realloc函数的返回值)
eg:假如在使用malloc开辟的20个字节空间
假设20个字节空间不够使用
再开辟40个字节的空间
这里就可以使用realloc来调整动态开辟的内存
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
int* p = (int*)malloc(5 * sizeof(int));
if (p == NULL)
{
printf("%s",strerror(errno));
}
else
{
for (int i = 0; i < 5; i++)
{
*(p + i) = i;
}
for (int i = 0; i < 5; i++)
{
printf("%d ", *(p + i));
}
}
int *ptr = realloc(p, sizeof(int));
if (ptr != NULL)
{
int i = 0;
p = ptr;//既可避免开辟失败把原先的也释放掉,又可以用指针p继续指向新开辟的空间
for ( i = 5; i < 10; i++)
{
*(p + i) = i;
}
for ( i = 5; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
free(p);
p = NULL;
return 0;
}
5.利用realloc可以代替malloc
int main()
{
int* p = realloc(NULL, 40);//==malloc(40)
return 0;
}