插入print语句时,变量值是否改变了?

时间:2015-02-01 18:03:01

标签: c

我正在处理10个变量的数组。我正在计算互相关。当我插入一个printf语句(返回0的最后两行)来包含返回的值时,从第二次迭代开始的sxy的值被改变(将其中的2个以粗体显示)。看到我得到的值 - 没有printf语句:

sxy = 0.000000
sxy = -0.441021, denom=0.944295
-5       -0.467037
sxy = 0.000000
sxy = **-0.232003**, denom=0.944295
-4       -0.245689
sxy = 0.000000
sxy = **0.066825**, denom=0.944295
-3       0.070767
sxy = 0.000000
sxy = -0.080936, denom=0.944295
-2       -0.085711
sxy = 0.000000
sxy = 0.304371, denom=0.944295
-1       0.322326

只需包含printf语句:

sxy = 0.000000
sxy = -0.441021, denom=0.944295
sxy = 0.000000
sxy = **-0.341112**, denom=0.944295
sxy = 0.000000
sxy = **-0.064583**, denom=0.944295
sxy = 0.000000
sxy = -0.085263, denom=0.944295
sxy = 0.000000
sxy = 0.333693, denom=0.944295
sxy = 0.000000
sxy = 0.625614, denom=0.944295
sxy = 0.000000
sxy = 0.074215, denom=0.944295

以下是代码:

int cxcor(float x[], float y[], float r[])
{
   /* Calculate the mean of the two series x[], y[] */
   int i, j, delay, maxdelay = MAXM/2, n = MAXM;
   float sx, sxy, mx = 0;
   float sy, denom, my = 0;   
   float rr[MAXM];

   for (i=0;i<n;i++) {
      mx += x[i];
      my += y[i];
   }
   mx /= n;
   my /= n;

   /* Calculate the denominator */
   sx = 0;
   sy = 0;
   for (i=0;i<n;i++) {
      sx += (x[i] - mx) * (x[i] - mx);
      sy += (y[i] - my) * (y[i] - my);
   }
   denom = sqrt(sx*sy);

   /* Calculate the correlation series */
   for (delay = -maxdelay; delay < maxdelay; delay++) {
      sxy = 0;
      printf ("sxy = %f \n", sxy );
      for (i=0;i<n;i++) {
         j = i + delay;
         while (j < 0)
            j += n;
         j %= n;
         sxy += (x[i] - mx) * (y[j] - my);
      }
      printf ("sxy = %f, denom=%f\n", sxy, denom);
      tr = sxy / denom;
      k = delay;
      r[ k] = tr;
      printf ("%d\t %f\n", k, r[k]);


   }


   return 0;
}   

2 个答案:

答案 0 :(得分:0)

这几乎肯定会在代码中的某处显示undefined behaviour

这可能是由于读取未初始化的变量或读取/写入数组末尾。

如果通过检查代码找不到问题,则使用Valgrind可能是一个很好的策略。

答案 1 :(得分:0)

这些线是主要问题:

k = delay;
r[ k] = tr;

因为delay的范围从-maxm/2+maxm/2 和数组的负偏移量(例如r[-maxm/2]) 将踩到内存中的内存(堆栈) 在r[]的定义之前。 这就是破坏价值观的原因。

这种动作,其中数组外部的内存地址绑定 踩到是未定义的行为 并且/将导致seg故障事件

建议:

k = delay+(maxm/2);
r[ k] = tr;

此外,此算法会产生不准确的结果 当maxm是奇数时。