S1E38:动态内存管理(下)--笔记
#include <stdio.h>#include <stdlib.h>
#include <string.h>
//鱼C论坛——BaysideLizard写于2023年11月24日
/*更灵活的内存管理方式
·malloc
--申请动态内存空间
·free
--释放动态内存空间
·calloc
--申请并初始化一系列内存空间
·realloc
--重新分配内存空间
*/
int main()
{
int *ptr = NULL;
int num,i;
printf("请输入待录入整数的个数:");
scanf("%d",&num);
ptr = (int*)malloc(num * sizeof(int));
if(ptr == NULL)
{
exit(1);
}
memset(ptr,0,num * sizeof(int));
/*等价于分配内存空间并初始化
ptr = (int*)calloc(8,sizeof(int));
*/
for(i = 0;i < num;i++)
{
printf("请录入第%d个整数:",i+1);
scanf("%d",&ptr);
}
printf("您录入的数字是:");
for(i = 0;i < num;i++)
{
printf("%d ",*(ptr+i));
}
putchar('\n');
free(ptr);
int *ptr1 = NULL;
int *ptr2 = NULL;
//第一次申请的内存空间
ptr1 = (int *)malloc(10 * sizeof(int));
if(ptr1 == NULL)
{
exit(1);
}
for(i = 0;i < 10;i++)
{
ptr1 = i;
}
//假设ptr1申请的内存空间不够用了。
//第二次申请内存空间。
ptr2 = (int *)calloc(20,sizeof(int));
if(ptr2 == NULL)
{
exit(1);
}
//将ptr1的数据拷贝到ptr2中。
memcpy(ptr2,ptr1,10 * sizeof(int));
free(ptr1);
//对ptr2申请的内存空间进行操作。
for(i = 10;i < 20;i++)
{
ptr2 = i;
}
for(i = 0 ;i < 20;i++)
{
printf("%d ",ptr2);
}
free(ptr2);
putchar('\n');
//以下程序不用malloc,用realloc实现malloc
int numa;
int count = 0;
int *ptra = NULL;//注意:这里必须初始化为NULL
do
{
printf("请输入一个整数(输入-1表示结束):");
scanf("%d",&numa);
count++;
ptra = (int*)realloc(ptra,count * sizeof(int));
//ptra为NULL,此时realloc相当于malloc
if(ptra == NULL)
{
exit(1);
}
ptra = numa;
}while(numa != -1);
printf("输入的整数分别是:");
for(i = 0;i < count;i++)
{
printf("%d ",ptra);
}
putchar('\n');
free(ptra);
return 0;
}
运行结果:
请输入待录入整数的个数:3
请录入第1个整数:1
请录入第2个整数:3
请录入第3个整数:5
您录入的数字是:1 3 5
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
请输入一个整数(输入-1表示结束):9
请输入一个整数(输入-1表示结束):8
请输入一个整数(输入-1表示结束):7
请输入一个整数(输入-1表示结束):8
请输入一个整数(输入-1表示结束):9
请输入一个整数(输入-1表示结束):0
请输入一个整数(输入-1表示结束):1
请输入一个整数(输入-1表示结束):-1
输入的整数分别是:9 8 7 8 9 0 1 -1
Process returned 0 (0x0) execution time : 8.075 s
Press any key to continue.
在FishC学C的第二十天 这段代码主要介绍了动态内存管理的相关函数,包括malloc、free、calloc和realloc。在第一个例子中,用户输入一个整数num,并根据num的值动态分配了num个int类型的内存空间,然后通过指针ptr来访问这些内存空间并进行操作,最后释放内存。之后又给出了一个示例,展示了使用calloc和memcpy来重新分配内存空间和复制数据的过程。
在这个例子中有两个值得注意的地方:
1. 在使用malloc或者calloc函数申请内存空间后,需要检查指针是否为NULL,如果为NULL说明分配内存失败。
2. 在循环中接收用户输入的整数,并将其存储到动态分配的内存空间中时,需要使用*(ptr + i)来访问每个元素的值,而不是直接使用ptr。因为ptr代表的是指向内存空间的指针,需要通过指针偏移来访问不同位置的元素。
3. 使用完动态分配的内存空间后,应该使用free()函数来释放这块内存空间,否则会造成内存泄漏。
另外,代码中还展示了如何使用realloc函数实现malloc的功能。使用realloc函数可以重新分配之前分配的内存空间,并返回指向新分配空间的指针。在使用realloc函数时,如果传入的指针为NULL,相当于使用malloc函数;如果传入的指针不为NULL,realloc函数将尝试扩展或者缩小原有内存空间。
希望这个解答对你有帮助,如还有其他问题,欢迎提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页:
[1]