malloc:
还有一点,开辟空间有可能开辟失败,所以我们需要判断一下是否开辟失败。
运行结果:
说明malloc开辟的空间值是随机值
我们向malloc开辟的空间里传值:
运行结果:
calloc
relloc:
#include<malloc.h>
#include<string.h>
#include<errno.h>
int main()
{
int* p = (int*)malloc(20);
//判断
if (p == NULL)
{
printf("%s", strerror(errno));
return 1;
}
for (int i = 0; i < 5; i++)
{
p[i] = i + 1;
}
//现在我想打印10个数,但是我malloc只开辟了5个int空间,所以我需要relloc来调整空间
int*ptr=(int*)realloc(p, 40);
if(ptr != NULL)
{
p = ptr;
}
else
{
printf("realloc:%s\n", strerror(errno));
}
for (int i = 5; i < 10; i++)
{
p[i] = i + 1;
}
for (int i =0;i<10;i++)
{
printf("%d ", p[i]);
}
//释放
free(p);
p = NULL;
return 0;
}
动态内存规划的常见错误:
1.没有判断空指针
这个代码会有什么问题呢?我们看:
显示取消对空指针的引用。这是什么意思呢?
第二种情况:越界访问。
这种情况是因为我们在用malloc开辟时只开辟了20个字节,也就是5个int类型,但是我们却打印了10个int,所以就下标越界了,我们改成打印5个就不会报错了。
第三种错误:对非动态开辟开辟的内存free释放
如图,会报错。因为不是在堆上开辟的内存空间,free释放就会报错。