【问题标题】:Filling array gives unexpected values填充数组给出了意外的值
【发布时间】:2016-09-07 11:29:43
【问题描述】:

我在填充数组时遇到了一个严重的问题。我的函数如下所示:

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[] 中的随机数。 这个问题可以通过某种内存管理来解决吗?

【问题讨论】:

  • 对不起,它在 C 中。
  • 您能告诉我们您在s_in 中添加了什么吗?
  • 你在哪里打印x。是在frame for 循环里面还是外面?
  • 在索引x 时,您必须始终使用介于 0 和 479 之间的值。当 frame > 0 时,i 将具有 >480 的值。

标签: c arrays memory


【解决方案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(&amp;x, &amp;s_in[left], 480); 来替换它。它与for 循环的当前状态相同,但运行速度更快。

【讨论】:

  • 感谢您的回答!我更改了代码并应用了您的建议。现在我在第 253 帧遇到分段错误,我只是不知道为什么。当我尝试打印 x[] 的值时,我只会收到错误消息。我确定 s_in[] 已填充在此框架内,但它怎么可能只在我尝试读取和打印 x[] 数组时给我分段错误?
【解决方案2】:

您的算法超出了 x 数组的范围。当您遍历帧时,您会获得比 x 数组的最大大小更长的值,然后您尝试访问未在内存中保留的 x 位置,因此会出现奇怪的数字。永远记住,C 不会检查数组是否越界

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2017-07-24
    • 2015-08-17
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多