运行时奇怪的崩溃

有谁知道,为什么下面的代码崩溃,当它用g ++编译?

#include <iostream>

unsigned long getSumDivisors(const unsigned long number) {
    unsigned long sum = 0;
    for(unsigned long i = 0; i < number; ++ i) {
        if(number % i == 0) {
            sum += i;
        }
    }
    return sum;
}

int main() {
    std::cout << getSumDivisors(5);
    return 0;
}

当我删除sum + = i; 它不会崩溃。

我试图在windows和linux linaro下编译它

g ++(Ubuntu / Linaro 4.7.3-1ubuntu1)4.7.3版权所有©2012 Free Software Foundation,Inc.这是免费软件; 请参阅复制条件的来源。 没有保修; 甚至不适用于适销性或针对特定用途的适用性。

g ++(tdm-2)4.8.1版权所有(C)2013 Free Software Foundation,Inc.这是免费软件; 请参阅复制条件的来源。 没有保修; 甚至不适用于适销性或针对特定用途的适用性。


它会导致一个SIGFPE。 原因是由于零除:

if(number % i == 0)

你可以在这里修复它:

 for(unsigned long i = 1; i < number; ++ i)

SIGFPE通常会在具有浮点单元的系统上发生,在这种情况下会引发异常。 实际行为依赖于implmentation细节并且未定义。 在具有浮点模拟库的较旧系统上,它可以返回0或或随机结果。


你除以0,因为我在for循环中以0开始,然后尝试获得分区的剩余部分


第一次通过循环,你有i = 0。你不能被零除,所以你的“数%i”是不好的。 它出现在您的系统上导致崩溃。

我想知道如果删除“sum + = i”会导致某种优化,从而if条件从不被检查,因为它是空的。

链接地址: http://www.djcxy.com/p/49707.html

上一篇: Strange crash at runtime

下一篇: gdb: how to set a breakpoint in a file with spaces