BaysideLizard 发表于 2023-11-21 23:15:26

关于动态内存管理的问题

#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

isdkz 发表于 2023-11-21 23:15:49

在上述代码中,存在几个问题导致程序运行出现意外中断和返回值不是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]
查看完整版本: 关于动态内存管理的问题