Ayu*_*shi 0 c segmentation-fault divide-by-zero undefined-behavior
int main()
{
int x = 5, y = 0;
int z = x / y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道它是在未定义的行为下,但它是否意味着分段错误?CPU处理如何除以0大小写?
当我运行它时,我得到浮点异常(核心转储).
如果行为未定义,则表示没有定义发生的情况.所以提出问题"它是否意味着分段错误"意味着你错过了这一点.任何事情都可能发生.
此外,有许多CPU,你没有指定一个,所以回答"CPU处理如何除以0"当然也是不可能的.
您可以捕获异常,并在代码中处理它们.
通常,浮点异常是更一般的异常类的示例.具体情况因机器而异.
有很多东西可以"杀死"你的程序,所有这些都可以归为这方面的例外:
在类Unix操作系统下,访问不存在的内存通常是"分段违规",而对内存的不正确访问通常是"总线错误".(在Windows下,它们是一般保护违规和/或BSOD.)
正如您所看到的,虽然除以0是一个例外,但它是分段违规的兄弟,而不是子集.
(我列出算术溢出作为一个例外,因为它可能是,不是因为它通常是.今天的大多数系统不把溢出作为例外,当然.但用C他们可能的规则,与溢出的例外on无符号整数,C需要定义并且表现良好.)
在类Unix操作系统,大多数/所有这些异常往往会被映射到信号,你的程序可以捕捉,使其能(尝试)继续,而不是死亡.
(讽刺的是,在系统上,我刚刚试了一下,整数除以0给了我一个"浮点异常",而浮点除以0给了我一个IEEE-754 inf,这是不是一个例外,在所有.但这是一个不同的问题.)