#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
//(1)malloc:申请空间
//void* malloc (size_t size)
//int main()
//{
// //向内存申请10个整型的空间
// int* p = (int*)malloc(10 * sizeof(int)); //开辟了40个字节的空间,不初始化
// //int* p = (int*)malloc(INT_MAX); //Not enough space
// if (p == NULL)
// {
// //打印错误原因的一种方式
// printf("%s\n", strerror(errno));
// }
// else
// {
// int i;
// for (i = 0; i < 10; i++)
// {
// *(p + i) = i;
// }
// for (i = 0; i < 10; i++)
// {
// printf("%d ",*(p+i));
// }
// }
//
// //当动态申请的空间不再使用时
// //就应该还给操作系统
// free(p); //此时只是把p还给操作系统,里面的值并没有改变
// p = NULL;
// return 0;
//}
//(2)calloc:
//void* calloc (size_t num, size_t size);
//int main()
//{
// int* p = (int*)calloc(10, sizeof(int));//初始化为0
//
// if (p == NULL)
// {
// printf("%s\n", strerror(errno));
// }
// else
// {
// int i;
// for (i = 0; i < 10; i++)
// {
// printf("%d ", *(p + i));
// }
// }
// //释放空间
// //free函数只能用来释放动态开辟的空间
// free(p);
// p = NULL;
// return 0;
//}
//(3):realloc:调整动态开辟内存空间的大小
//void* realloc (void* ptr, size_t size);
int main()
{
int* p = (int*)malloc(20);
int i;
if(p==NULL)
{
printf("%s\n", strerror(errno));
}
else
{
for ( i = 0; i < 5; i++)
{
*(p + i) = i;
}
}
//在使用malloc开辟的20个字节的空间时
//假设这里,20个字节不够
//我们希望有40个字节的空间:
//realloc使用的注意事项:
//1、如果p指向的空间之后有足够的内存空间追加,则直接追加,再返回p
//2、如果p指向的空间之后没有足够的内存空间追加,则realloc重新开辟一个内存区域
//并且把原来内存中的数据拷贝过来,再释放原来开辟的内存空间,最后返回新开辟的空间地址
//3、最好用新的变量接收realloc函数的返回值
int* ptr = (int*)realloc(p, 40);
if(ptr!=NULL)
{
p = ptr;
}
for(i=5;i<10;i++)
{
*(p + i) = i;
}
for(i=0;i<10;i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}