C数组更改导致变量修改

我正在尝试使用C编程语言修改数组中的值,我似乎用这个看似简单的操作来打一个空白的墙。请参阅下面的代码段:
while(1) {
        printf("Current prime candidate is %in",nextPrimeCandidate);
        int innerSieve;//=2;
        int currentPrimeCandidate=0;

        for (innerSieve=2;innerSieve<SIEVELIMIT;innerSieve++) {
            currentPrimeCandidate = nextPrimeCandidate * innerSieve;
            //printf("Inner Sieve  is b4 funny place %i,%in",innerSieve,currentPrimeCandidate);

            //initArray[currentPrimeCandidate]=5;
            //VERY UNIQUE LINE
            myArray[currentPrimeCandidate] = 0;



            //printf("Inner Sieve after funny place is %i,%i n",innerSieve,currentPrimeCandidate);

        }
        nextPrimeCandidate=getNextPrimeCandidate(myArray,++nextPrimeCandidate);
        if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;

    }
问题在于用
VERY UNIQUE LINE
注释突出显示的行。由于某种原因,当innerSieve变量达到33并到达该行时,它将innerSieve变量的内容设置为该行的值(当前为0)并且基本上强制循环进入无限循环(
SIEVELIMIT
变量是设定为50)。当我使用Eclipse Debug工具检查时,似乎寄存器中有一些有趣的东西,但我不太清楚我应该寻找什么。 如果你需要整个代码清单,可以提供这个。(在代码中初始化的特定变量在innerSieve变量命中32的精确点处初始化) 任何帮助将不胜感激。     
已邀请:
猜测
currentPrimeCandidate
大于
myArray
的最大指数,并且你正在覆盖
innerSieve
(在堆栈上可能跟随
myArray
)。     
@ruslik在评论中点击它。问题是这一行:
if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;
在C中,
^
运算符不是幂运算符,它是按位xor运算符。你的迭代次数比想要的要多得多,这会导致数组索引越界错误,所以你要覆盖随机内存并得到奇怪的结果。 C中没有幂运算符(尽管有
pow
函数)。由于您只是对一个数字求平,最简单的解决方法是将数字乘以它自己:
if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;
    

要回复问题请先登录注册