C中的内存分配,使用Realloc

时间:2018-11-20 07:11:18

标签: c dynamic-memory-allocation realloc

我如何在这里对calloc使用realloc函数。请指导?? calloc函数的第一个输入是给我正确的输出,但是在使用realloc函数之后,我的编译器被卡住了,我在这里犯什么错误? 输出是给定的:

    #include<stdio.h>
#include<stdlib.h>
int main()
{
    int n,n2,sum=0,i;
    int *ptr,*p;
    printf("Enter Totoal Number of elements:");
    scanf("%d",&n);
    ptr=(int*)calloc(n,sizeof(int));
    for(i=0;i<n;i++)
    {
        printf("Enter %d Element:",i+1);
        scanf("%d",ptr+i);
        sum=sum+*(ptr+i);
    }
    printf("The sum is: %d\n",sum);
    printf("Enter new size:");
    scanf("%d",&n2);
    p=(int *)realloc(ptr,n2*sizeof(int));
    for(i=0;i<n2;i++)
    sum=sum+*(p+i);
    printf("The new sum is:%d",sum);

    free(ptr);
    free(p);
}

OUTPUT HERE

2 个答案:

答案 0 :(得分:2)

更新后编辑:您正在两次释放相同的指针。

free(ptr);
free(p);

根据man realloc:realloc返回作为参数传递的指针,因此ptrp相同。实际上,您这里不需要两个指针。

如果要初始化,请改用ptrp,这是我想尝试的方法,

 for(i=0;i<10*sizeof(int);i++)

您要循环10 * sizeof(int)次以遍历10个大小的数组,访问*(ptr+i)就像访问ptr[i]ptr+i的计算结果为地址ptr + sizeof(*p) ,如果您想了解更多信息,可以阅读有关指针算法的信息。

在您的情况下,您将超出分配的内存范围,因为动态分配的数组的大小为10。

答案 1 :(得分:1)

您只需不将sum重置为零。

printf("Enter new size:");
scanf("%d",&n2);
p=(int *)realloc(ptr,n2*sizeof(int));

for(i=0;i<n2;i++)
   sum=sum+*(p+i);

printf("The new sum is:%d",sum);

在要求新的大小之前,您已经汇总了n个条目。 然后,在第一个n2条目之上添加。 如果您只想填写n2个条目,只需在再次添加之前设置sum=0;

如果n2 > n,因为您没有为新条目提供新值,您的代码也会中断。

另一个错误:

free(ptr);
free(p);

致电ptr后,您将无法再使用realloc。如果需要移动内存位置,它可能已经在realloc中释放了。那样的记忆就不再是你的了。 或者它可能与p相同,那么您将尝试释放两次相同的内存。 两者都不是好主意。