填充数组会产生意外值

时间:2016-09-07 11:29:44

标签: c arrays memory

填充数组时遇到严重问题。我的功能如下:

int s_in[]; /* Array filled with a lot of integer values */
for(frame=0; frame<maxFrames; frame++){
  left = 240*(frame-1) + 1;
  right = 240*(frame +1);
  int x[right-left+1]; /* is always 480 long */

  for(i=left-1;i<right;i++){
    x[i] = s_in[i];
  }

当我现在尝试打印出每次运行中存储在x []中的值时,我经常得到一个空的x []或一些未出现在s_in []中的随机数。 用某种内存管理可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

你的算法超出了x数组的范围。迭代帧时,您获得的值大于x数组的最大大小,然后您尝试访问未在内存中保留的x位置,因此是奇怪的数字。永远记住C不检查数组是否超出界限

答案 1 :(得分:1)

该行有两个问题:

x[i] = s_in[i];

在第一次迭代中,当执行aboce行时,变量的值为:

frame:    0
left:  -239
i:     -240

代码尝试从s_in[]的边界之外读取并在x[]的边界之外写入写入。

这是undefined behaviour

在不知道s_in[]中如何布置信息的情况下,很难为代码提供修复。假设一个帧是240个字节,并且在每次迭代时你想要将s_in[]的两个连续帧的值复制到x[],代码应该看起来像这样:

int s_in[]; /* Array filled with a lot of integer values */
for (frame = 1; frame < maxFrames; frame ++) {
  left  = 240 * (frame - 1);        /* the first value of the previous frame */
  right = 240 * (frame + 1);        /* the first value of the next frame */
  int x[480];                       /* is always 480 long */

  for (i = 0; i < 480; i ++) {
    x[i] = s_in[left + i];
  }
}

每次迭代计算right-left+1都没有意义,因为您已经知道它必须是480。正如您从上面的代码中看到的那样,甚至不需要right的值。

外部循环应以frame = 0开头,但对于第#0帧,违规行会尝试从外部s_in[]读取;这就是为什么它从框架#1开始。

我想你在内循环中做了更多的处理。否则,您可以通过调用memcpy(&x, &s_in[left], 480);来替换它。它与for循环的当前状态相同,但运行速度更快。