填充数组时遇到严重问题。我的功能如下:
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 []中的随机数。 用某种内存管理可以解决这个问题吗?
答案 0 :(得分:1)
你的算法超出了x数组的范围。迭代帧时,您获得的值大于x数组的最大大小,然后您尝试访问未在内存中保留的x位置,因此是奇怪的数字。永远记住C不检查数组是否超出界限
答案 1 :(得分:1)
该行有两个问题:
x[i] = s_in[i];
在第一次迭代中,当执行aboce行时,变量的值为:
frame: 0
left: -239
i: -240
代码尝试从s_in[]
的边界之外读取并在x[]
的边界之外写入写入。
在不知道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
循环的当前状态相同,但运行速度更快。