C数组更改导致变量修改

C数组更改导致变量修改,c,arrays,gcc,ubuntu-9.04,C,Arrays,Gcc,Ubuntu 9.04,我试图用C编程语言修改数组中的一个值,而这个看似简单的操作似乎让我遇到了麻烦。请参阅下面的代码片段: while(1) { printf("Current prime candidate is %i\n",nextPrimeCandidate); int innerSieve;//=2; int currentPrimeCandidate=0; for (innerSieve=2;innerSieve<SIEVELIMIT;

我试图用C编程语言修改数组中的一个值,而这个看似简单的操作似乎让我遇到了麻烦。请参阅下面的代码片段:

while(1) {
        printf("Current prime candidate is %i\n",nextPrimeCandidate);
        int innerSieve;//=2;
        int currentPrimeCandidate=0;

        for (innerSieve=2;innerSieve<SIEVELIMIT;innerSieve++) {
            currentPrimeCandidate = nextPrimeCandidate * innerSieve;
            //printf("Inner Sieve  is b4 funny place %i,%i\n",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;

    }
问题在于用非常独特的行注释突出显示的行。出于某种原因,当innerSieve变量达到33并到达该行时,它会将innerSieve变量的内容设置为该行当前为0的值,并基本上强制循环进入无限循环。SIEVELIMIT变量设置为50。当我使用Eclipse调试工具进行检查时,寄存器中似乎出现了一些有趣的事情,但我不太确定我应该寻找什么

如果您需要完整的代码清单,可以提供。代码中尚未初始化的特定变量在innerSieve变量达到32的精确点进行初始化


任何帮助都将不胜感激。

猜测currentPrimeCandidate大于myArray的最大索引,您正在覆盖堆栈上myArray后面的innerSieve。

@ruslik在评论中提到了这一点。问题在于这一行:

if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;
在C语言中,^运算符不是幂运算符,而是按位异或运算符。您的迭代次数超出了预期,这导致了数组索引越界错误,因此您正在覆盖随机内存并得到奇怪的结果

虽然有函数,但C中没有幂运算符。由于您只是将一个数字平方,最简单的解决方法是将该数字本身相乘:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;

如果NextTimeCandidate ^2>SIEVELIMIT中断了怎么办;意思是?我显然是想检查被提升到2的幂的NextTime候选人是否大于SIEVELIMIT,但是在阅读了下面的Adam Rosenfields答案之后,我真的应该忘记我在处理CYep时的JAVA经验,在你的内部循环中,试着用SIEVE_LIMIT限制数组的实际长度!currentPrimeCandidate的值,而不是innerSieve的值。我实际上不知道C没有显式幂运算符!实际上,我已经用tomlogics的答案解决了这个问题,但是现在您已经添加了这个,我可能需要返回并回顾我所做的。谢谢