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;
}