gpt4 book ai didi

c - 填充数组给出了意想不到的值

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:26 26 4
gpt4 key购买 nike

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

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

最佳答案

线路有两个问题:

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 循环的当前状态相同,但运行速度更快。

关于c - 填充数组给出了意想不到的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39368726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com