为什么这段代码只循环4次?

时间:2012-06-29 04:13:19

标签: c pointers malloc

背景:我试图澄清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;
}

2 个答案:

答案 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必须是这两行之一!