为什么这段代码在不同的机器上会导致不同的行为?
Why does this code result in different behavior on different machines?
显然,这段代码有时会进入无限循环,有时会终止,有时会根据机器出现分段错误。为什么行为不一致?
void loop() {
int x[512];
int i=0;
while (i++ <512) {
x[i] = 0;
}
}
int main () {
printf("nCalling loop -->>n");
loop();
}
因为您正在执行后增量。当i
是511时,它传递不等式,但随后它增加到512。分配x[512]
是访问冲突到内存,可能是或可能不是(它是未定义)由您的应用程序拥有。正如在注释中所述,在不同的平台上您会遇到略有不同的行为,因为这个错误会导致所谓的未定义行为。换句话说,这个(错误的)操作的结果没有由c++标准定义。由于不同的编译器和操作系统具有不同的底层实现-您将获得不同的行为
如果你调用未定义的行为(正如你所做的),你会得到未定义的行为-这意味着不同的编译器可以在同一台机器上给出不同的结果,不同的编译器在不同的机器上可以给出不同的结果;见鬼,一台机器上的一个编译器可以看到月亮的相位,并根据它决定做不同的事情!它们都是正确的,因为未定义行为就是——未定义。
如果你得到一个无限循环,机会是&x[512] == &i
,当你把0写到x[512]
时(这是未定义的行为),你把i
归零,循环继续。
如果它崩溃了,很可能是x[512]
与调用堆栈上的一些关键控制信息一致,并且由于践踏返回地址或帧指针,您已经完全搞砸了系统。
但是,不管怎样,机器和编译器工作得很好;你的代码就是问题所在。你的循环应该是:
while (i < 512)
x[i++] = 0;
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 使用不同的链接器会产生不同的机器代码吗
- objdump 不显示机器代码,但显示 ASM
- 从.o目标文件中提取函数的原始机器代码?
- 我在区分源代码、目标代码、汇编代码和机器代码时感到困惑
- 如果C++编译为机器代码,为什么我们需要安装"运行时"?
- 是否可以执行存储在变量中的机器代码
- "Double or Nothing"赌博机器代码无法超过15组合
- 如何在 c++ 中将机器代码作为函数运行
- 可以从文件执行机器代码吗?
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- 如何将高级/低级编程代码直接转换为机器代码
- (如何)我可以使用LLVM机器代码分析器预测代码片段的运行时间
- 如何使用llvm生成机器代码
- 使用LLVM生成纯机器代码
- 注释会被翻译成机器代码吗?C++
- 如何使用c++执行附加在可执行文件末尾的机器代码
- 如何从机器代码中恢复C++尝试/抛出/捕获块长度和地址
- 是否有编译器可以编译为机器代码的 C C++ C# 编译器
- C++ - 极其奇怪的机器代码行为