2016-09-07 61 views
1

填充数组时,出现严重问题。我的功能看起来是这样的:填充数组给出意想不到的值

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 []或不出现在一些随机数罪[]。 可以用某种内存管理来解决这个问题吗?

+0

对不起,它在C. – Alex

+0

你能告诉我们你在's_in'中放入了什么吗? – byxor

+0

你在哪里打印'x'。它是在循环内还是在外面? –

回答

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

+0

谢谢你的回答!我更改了代码并应用了您的建议。现在我在第253帧出现分段错误,我只是不知道为什么。当我尝试打印出x []的值时,我只会遇到错误。我确信,s_in []是在这个框架内填充的,但是它怎么会是这样呢,当我试图读取和打印x []数组时,它只会给我分段错误? – Alex

1

您的算法已经超出了x数组的范围。当你迭代帧时,你得到的值比x数组的最大值还要长,然后你尝试访问未在内存中保留的x位置,因此会出现奇怪的数字。永远记住,C不检查数组越界