1

我正在使用 PellesC C 编译器。有时我的代码会随机停止工作。一个特定的语句可以触发它。例如,我将一个变量乘以 sin(c)(c 是一个双精度数),我的代码似乎刚刚完成执行而没有结果。有时它会冻结,有时它似乎只是返回,但我总是可以通过删除有问题的语句或禁用编译器优化来修复它,特别是“最大化速度”或“最大化速度更多”。如果我在崩溃点附近的某个地方添加一个 printf 语句,冻结也会在几乎 100% 的情况下消失。我从来没有发现任何暗示我访问内存不正确的东西,我很确定这是一个编译器问题。我想知道是否有人可以对此有所了解。有没有可能我是,事实上,做错了什么?或者这是 Pelles C 编译器的一个已知问题?

编辑:

改变

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+sin(c)));

to(最后一行末尾的差异)

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+1));

让它工作。

4

2 回答 2

4

可能是,但一个不错的选择是你 :) 未显式初始化的变量通常会在优化与未优化的构建中获得不同的值,因为堆栈布局可能会根据编译器删除临时变量的积极程度而微妙地变化,以及其他因素。

于 2012-07-11T22:58:46.110 回答
2

您可能不小心在某处使用了未定义的行为,并且更改程序中的随机指令正在破坏堆栈上代码的非常脆弱的对齐方式,而堆栈中恰好使程序工作。

于 2012-07-12T04:12:58.943 回答