我正在尝试使用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的精确点处初始化)
非常感谢任何帮助。
答案 0 :(得分:4)
猜测currentPrimeCandidate
大于myArray
的最大索引,并且您正在覆盖innerSieve
(可能在堆栈上跟myArray
之后)。
答案 1 :(得分:4)
@ruslik在评论中点击它。问题是这一行:
if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;
在C中,^
运算符不幂运算符,它是按位xor 运算符。你的迭代次数比想要的要多得多,这会导致数组索引越界错误,所以你要覆盖随机内存并得到奇怪的结果。
C中没有幂运算符(尽管有pow
函数)。由于您只是对一个数字进行平方,因此最简单的方法是将数字乘以:
if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;