我正在研究C中的一个研究项目,在Windows上使用Eclipse和CDT,MinGW和GDB。
我有一个int数组,其元素应介于0和3(含)之间。我正在迭代数组并打开数字。我在我的默认情况下遇到了一个断言(0),以防我搞砸了某个地方并且我的界限之外的数字偷偷溜进来。现在,每当我运行程序时,这个断言就会进行某些输入。很好 - 我搞砸了某个地方,一个越界的数字正在偷偷摸摸。这是我可以处理的事情。问题是,当我在调试器中运行程序时,一切正常。断言从未触发,结果正确,并且没有问题。我不太关心错误的事实,而不是在调试时我无法重现错误的事实。
这是相关代码。 int * zeroPairs的每个%3 = 0元素(应该是)在0和3(包括)之间。接下来的两个元素是不同数组的索引,可以是各种数字。 j * 3不会超出zeroPairs的范围。数组A,B,C和D在每个索引中仅包含1或-1。当我有一个典型的A = temp,A = B等交换时,它工作正常。当我将其简化为只更改每个1上的符号时就是这个错误开始的时候。
感谢您的帮助!
for (j = 0; j < bits; ++j) {
if (k & (1 << j)) { //Check if a bit is set, if so, swap the correct elements
switch (zeroPairs[j * 3]) {
case 0:
A[zeroPairs[j * 3 + 1]] = -A[zeroPairs[j * 3 + 1]];
A[zeroPairs[j * 3 + 2]] = -A[zeroPairs[j * 3 + 2]];
break;
case 1:
B[zeroPairs[j * 3 + 1]] = -B[zeroPairs[j * 3 + 1]];
B[zeroPairs[j * 3 + 2]] = -B[zeroPairs[j * 3 + 2]];
break;
case 2:
C[zeroPairs[j * 3 + 1]] = -C[zeroPairs[j * 3 + 1]];
C[zeroPairs[j * 3 + 2]] = -C[zeroPairs[j * 3 + 2]];
break;
case 3:
D[zeroPairs[j * 3 + 1]] = -D[zeroPairs[j * 3 + 1]];
D[zeroPairs[j * 3 + 2]] = -D[zeroPairs[j * 3 + 2]];
break;
default:
printf("Whoops %d", zeroPairs[j * 3]);
fflush(stdin);
assert(0);
}
}
}
答案 0 :(得分:3)
调试版本通常“正确”工作,因为未初始化的变量设置为默认值。
此外,超出绑定的数组和指针访问通常不会导致覆盖其他变量,因为元素之间存在额外的填充。您在调试版本中仍然存在错误,但您可能没有意识到这一点。