C数组更改导致变量修改

时间:2010-11-30 00:41:19

标签: 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;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)并且基本上强制循环进入无限循环({{1变量设置为50)。当我使用Eclipse Debug工具检查时,似乎寄存器中有一些有趣的东西,但我不太确定我应该寻找什么。

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

@ruslik在评论中点击它。问题是这一行:

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

在C中,^运算符幂运算符,它是按位xor 运算符。你的迭代次数比想要的要多得多,这会导致数组索引越界错误,所以你要覆盖随机内存并得到奇怪的结果。

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

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