循环缓冲区重置内存

circular buffer resets memory?

本文关键字:内存 缓冲区 循环缓冲 循环      更新时间:2023-10-16

当这个循环回到dd[0]时,设置为0,相当于256.1??"dd"内存似乎正在重置,"aa"返回0。

unsigned char aa = 0;
double *dd = new double[256];
//circular buffer
dd[aa] = 0.1;
for(int i = 0; i < 600; i++){
    qstr += QString::number(aa,'d',0) + "  " + QString::number(dd[aa],'f',1) + "         ";
    aa++;//onces 'aa' reaches 255, the next increment resets back to 0 for 'aa'
    dd[aa] = dd[aa - 1] + 1;
}

您已将aa声明为unsigned char。因此,当你达到255并递增时,它会回到0。您可能应该使用int,因为该变量用作数组索引变量。

这是因为当aa255增加1时,它会因为unsigned char而进入0,所以它变成了dd[0] = dd[-1] + 1,现在任何junk都可以出现在dd[-1]上,这里似乎有-1

此外,如果访问数组超出了它的边界,这是一种未定义的行为。当aa变成0时,您应该尽量避免。

无符号字符长度为8位。无符号字符最多可容纳255个字符。(二进制1111111)。如果您将其递增1,则它将变为0

我进行铸造是为了避免aa=-1:

    dd[aa] = 0.1;
    for(int i = 0; i < 600; i++){
        qstr += QString::number((unsigned char)((unsigned char)aa-(unsigned char)1),'d',0) + "  " + QString::number(dd[aa],'f',1) + "         ";
        aa++;
        dd[aa] = dd[(unsigned char)((unsigned char)aa-(unsigned char)1)] + 1;  // casting
    }