切换到For循环 - 在Release模式下获得奇怪的结果

时间:2010-08-28 16:42:58

标签: c++ c

是否有任何针对结构的言论如下。在发布模式下,Visual Studio似乎忽略了i< 10并执行循环结束。如果我设置了一个断点,我会看到我从0到9运行并在所有进一步的迭代中保持在9。如果我printf i,我在10次迭代后得到一个错误,因为arr只有10个字段。很奇怪。请帮忙。

for (i = 0; i < 10; i++){
  switch (arr[i].type1){
     case A:
        //something  
        break;

     case B:
        switch (arr[i].type2){
         //something
        }
        break;

     default:
        break;
  }
}

谢谢!


编辑:我删除了所有switch语句,并用if语句替换它们。现在工作得很好。我仍然很难相信我是对的并且Visual Studio错了。那个程序中我所有的其他Switch语句呢? :/

4 个答案:

答案 0 :(得分:2)

我怀疑

 // something

可能与它有关。如果按原样运行此代码(删除实际案例代码) - 是否会发生?

如果你拿整个开关把它放在一个函数中怎么样?

您可能会直接或{或某些内存限制问题'在// something中某处更改。

答案 1 :(得分:0)

将循环变量更改为j并创建循环的第一行:

int i = j;

它还能做到吗?

答案 2 :(得分:0)

你的例子没有错。也许你在代码的其他部分有一些意外的堆栈覆盖或类似的东西,在那个地方引入了奇怪的副作用(并没有意义进行调试会话)?

答案 3 :(得分:0)

只要我不知道// something做了什么,我就会给你最好的想法,我已经知道了;

如果这只发生在发布模式,我猜想编译器完成的优化可能是这种奇怪行为的原因。

如果您可以使用上面给出的确切代码可靠地进行此操作,我会说您应该尝试关闭优化并查看是否有帮助。