c - 当我插入打印语句时变量值发生改变?

标签 c

我正在处理 10 个变量的数组。我正在计算互相关。当我插入 printf 语句(从 return 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;
}   

最佳答案

这几乎肯定表明 undefined behaviour代码中的某处。

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

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

关于c - 当我插入打印语句时变量值发生改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265948/

相关文章:

c - 我正在尝试为 ARM Cortex M3 编写模拟器。如何读取二进制文件然后对其进行解码?

c - 在c中返回一个空白整数

c - 如何在 Makefile 中使用带有 ':' 的变量?

c - substring -- c 内联汇编代码

c - if语句成功后如何停止? C语言编程

编译包含包含 C 定义的头文件的汇编代码

c - 如何确定时间日期戳

c - 在 C 中制作带有星号的正方形

c - 输入文件作为参数时出现段错误 [C 语言]

c - 不是 c 中结构的预期结果循环