循环缓冲区重置内存?

时间:2013-08-09 15:56:01

标签: c++

当这个循环回来时,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;
}

4 个答案:

答案 0 :(得分:3)

aa声明为unsigned char。 所以当你达到255并且递增时,它会回到0.你可能应该使用一个int,因为这个变量被用作数组索引变量。

答案 1 :(得分:2)

这是因为当aa255增加1时,由于0,它会转到unsigned char,因此现在变为dd[0] = dd[-1] + 1任何junk }}可以出现在dd[-1],此处似乎有-1

此外,您正在从其边界访问数组,这是一个未定义的行为。 您应该在aa变为0时尝试避免。

答案 2 :(得分:0)

无符号字符长度为8位。 unsigned char可以保存的最大数量是255.(在二进制1111111中)。如果将其递增1,则它将变为0

答案 3 :(得分: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
    }