我如何在这里对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);
}
答案 0 :(得分:2)
更新后编辑:您正在两次释放相同的指针。
free(ptr);
free(p);
根据man realloc
:realloc返回作为参数传递的指针,因此ptr
和p
相同。实际上,您这里不需要两个指针。
如果要初始化,请改用ptr
或p
,这是我想尝试的方法,
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
相同,那么您将尝试释放两次相同的内存。
两者都不是好主意。