背景:我试图澄清C中指针和动态内存分配的谜团。我试图从用户那里获得几个浮点输入,将它们存储在一个动态分配的数组中,从而扩展以容纳更多的值。一旦用户输入0,循环终止并计算和打印总和和平均值。我正在使用Borland C 5.02
问题: 1.循环仅起作用4次,然后不存储第4个值! 2.如果我用x [i]和*(x + i-1)用x [i-1]替换x + i,我得到“浮点错误:堆栈错误”“异常程序终止。
int main(void)
{
float *x;
float sum=0;
float avg=0;
int i=0;
x=(float*)malloc(sizeof(float));
do
{
scanf("%f",x+i); //take input
i++;
x=(float*)realloc(x, i*sizeof(float)); //reallocate memory to store more values
if(x==NULL){printf("WARNING");}
printf("\n%f %p %d\n",*(x+i-1),x,i);
}while(*(x+i-1)!=0);
for(int j=0;j<i;j++)
{sum=sum+*(x+j);} // Sum all values
avg=sum/(i-1); //Find result, i is 1 bigger than number of values, ith value is 0
printf("\n\n%d sum: %f avg: %f ",i,sum,avg);
getch();
return 0;
}
答案 0 :(得分:10)
由于i
基于0,因此您的realloc应为:
x=(float*)realloc(x, (i+1)*sizeof(float));
答案 1 :(得分:0)
我编译了你的程序并运行它。我使用-g
构建并尝试调试它。它给出了这条消息,然后是堆栈回溯:
*** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000000797010 ***
对我而言,它在第6个数字之后死亡。
我搜索了上述有关“无效的下一个尺寸”的错误消息,但没有发现任何真正有用的内容。我找到的所有答案基本上都是“你做了一些破坏你的堆的东西”但是在你的程序中我没有发现应该做的任何事情。
编辑:好的,确定的是,在分配的内存结束后写入会导致堆损坏。那应该教我。有一次打电话给realloc()
和一个写入记忆的地方;这个bug必须是这两行之一!