0

我正在尝试使用 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;

    }

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

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

任何帮助将不胜感激。

4

2 回答 2

4

猜测它currentPrimeCandidate大于 的最大索引myArray,并且您正在覆盖innerSieve(可能myArray在堆栈上跟随)。

于 2010-11-30T00:43:41.357 回答
4

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

if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;

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

C 中没有幂运算符(尽管有pow函数)。由于您只是对数字进行平方,因此最简单的解决方法是将数字乘以自身:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;
于 2010-11-30T00:48:57.927 回答