关于动态内存管理的问题
#include <stdio.h>#include <stdlib.h>
#include <string.h>
/*更灵活的内存管理方式
·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,8 * 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));
}
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;
}
for(i = 0;i < 10;i++)
{
printf("%d ",ptr1);
}
//假设ptr1申请的内存空间不够用了。
//第二次申请内存空间。
ptr2 = (int *)calloc(20,sizeof(int));
if(ptr2 == NULL)
{
exit(1);
}
//将ptr1的数据拷贝到ptr2中。
memcpy(ptr2,ptr1,10 * sizeof(int));
free(ptr1);
//对ptr2申请的内存空间进行操作。
free(ptr2);
return 0;
}
运行结果:
请输入待录入整数的个数:3
请录入第1个整数:1
请录入第2个整数:2
请录入第3个整数:3
您录入的数字是:1 2 3
Process returned -1073740940 (0xC0000374) execution time : 9.945 s
Press any key to continue.
执行完上半段程序后就意外中断了,返回值不是0 在上述代码中,存在几个问题导致程序运行出现意外中断和返回值不是0的情况。
首先,对于动态内存的分配和释放,程序中使用了 malloc 和 calloc 进行内存的申请,但在释放内存时只使用了一次 free 。这导致了内存泄漏的问题,应该在程序结束前,对所有申请的内存空间进行释放。
其次,对于 memset 的使用存在问题。在代码中,使用 memset(ptr,0,8 * sizeof(int)); 对内存进行初始化,但是 8 * sizeof(int) 并不等于 num * sizeof(int) ,这导致了内存初始化的错误。应该使用 num * sizeof(int) 来进行内存初始化,或者直接使用 calloc 进行内存分配和初始化。
最后,对于 memcpy 函数的使用也存在问题。在将 ptr1 的数据拷贝到 ptr2 时,应该使用 memcpy(ptr2, ptr1, 10 * sizeof(int)); ,而不是 memcpy(ptr2, ptr1, 20 * sizeof(int)); ,因为 ptr1 只申请了10个整数的内存空间。
综上所述,需要对代码进行如下修改:
1. 在程序结束前,对所有申请的内存空间进行释放,使用 free 函数。
2. 修改 memset 的参数为 num * sizeof(int) 。
3. 修改 memcpy 的参数为 memcpy(ptr2, ptr1, 10 * sizeof(int)); 。
修改后的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int *ptr = NULL;
int num, i;
printf("请输入待录入整数的个数:");
scanf("%d", &num);
ptr = (int *)malloc(num * sizeof(int));
if (ptr == NULL)
{
exit(1);
}
// 使用calloc进行内存分配和初始化
// ptr = (int *)calloc(num, sizeof(int);
for (i = 0; i < num; i++)
{
printf("请录入第%d个整数:", i + 1);
scanf("%d", &ptr[ i]);
}
printf("您录入的数字是:");
for (i = 0; i < num; i++)
{
printf("%d ", *(ptr + i));
}
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] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ptr1[ i]);
}
ptr2 = (int *)malloc(20 * sizeof(int));
if (ptr2 == NULL)
{
exit(1);
}
memcpy(ptr2, ptr1, 10 * sizeof(int));
free(ptr1);
// 对ptr2申请的内存空间进行操作。
free(ptr2);
return 0;
}
页:
[1]