4195808的交易是什么?

时间:2016-12-01 13:53:59

标签: c

试图理解malloc和calloc,所以我观看了一些TheNewBoston关于这个主题的视频。但由于某种原因,我得到了一个非常奇怪的输出,让我先显示代码。

#include <stdio.h>
#include <stdlib.h>

int
main()
{
  int i, howMany;
  int total;
  float average = 0.0;
  int * pointsArray;

  printf("How many do you want to store: \n");
  scanf("%d", &howMany);

  pointsArray = (int *) malloc(howMany * sizeof(int));

  printf("Enter your numbers: \n");

  for(i = 0; i < howMany; i++)
    {
      scanf("%d", &pointsArray[i]);
      total += pointsArray[i];
    }
  average = (float)total / (float)howMany;

  printf("Average is: %f\n", average);

  free(pointsArray);

  return 0;
}

应该计算您输入的数字的平均值。问题是变量&#34; total&#34;由于某种原因得到起始值4195808。首先,我做了一个自己的解释&#34; TheNewBoston的代码,但在我收到此错误之后,我只是复制了它,但同样的问题仍然存在。为什么会这样?我找不到任何有类似问题的人的信息。

5 个答案:

答案 0 :(得分:6)

您没有初始化total,因此值未定义。一些编译器/运行时可能纯粹巧合,在堆栈上碰巧有零,其他编译器/运行时可能有C运行时初始化留下的任意值。如果您希望total最初为零,请将其初始化为零:

int total = 0;

答案 1 :(得分:2)

由于某种原因,

的起始值为4195808.

原因是int total;具有自动存储持续时间(已分配堆栈),因此其初始值是不确定的。

那是Undefined Behavior

  

From the ISO/IEC 9899:201x @ page 158

     

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不确定的。

必须显式地初始化局部变量,所以

int total = 0;

答案 2 :(得分:2)

在未初始化的函数内部声明的变量具有不确定的值。尝试访问它而不在undefined behavior初始化结果。

例如,使用不同的编译器或不同的优化设置编译此代码可能会导致此不确定值发生更改。

来自C standard的第6.7.9节:

  

10 如果没有明确初始化具有自动存储持续时间的对象,则其值不确定。
  ...

您应该将此变量显式初始化为已知值。

int total = 0;

至于为什么同样&#34;随机&#34;每次都使用值,有问题的变量在main中声明,所以无论它的初始值是什么,都可能是基于程序的启动方式。为安全起见,操作系统应擦除分配给新进程的所有内存,因此重新启动不应影响它。

如果有问题的变量是在main以外的函数中,那么它的初始值将取决于函数被调用的程序流中的位置以及在它离开之前调用的函数堆栈上的数据。

然而,这是未定义的行为。其他编译器不必与此行为保持一致,因此不要依赖它。

答案 3 :(得分:1)

您没有初始化total值,这意味着在您开始向其添加数字之前,它包含“随机”值。只需将total初始化为零即可。这里的an older answer to a similar question更深入地介绍了C中的局部变量初始化。

答案 4 :(得分:1)

存储在保留给total变量的存储单元中的先前值。将其初始化为0