SIGSEGV,Windows 中的分段错误,尽管 运行 在 Linux 中正常

SIGSEGV, Segmentation fault in Windows although running fine in Linux

// 10001st prime
/*
 * By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13,
 * we can see that the 6th prime is 13.
 * What is the 10001st prime number?
 */

#include<stdio.h>
#include<math.h>

#define FIRST_NUM 2
#define START_COUNT 0

void prime(int num, int count)
{
    int i, flag=1;
    for(i=2; i<=sqrt(num); i++)
    {
        if(num%i==0)
        {
            flag=0;
            break;
        }
        flag=1;
    }
    if(flag)
    {
        count++;
        if(count==10001)
            printf("The 10001st prime number is %d\n", num);
    }
    if(count!=10001)
        prime(num+1, count);
}

int main(void)
{
    prime(FIRST_NUM, START_COUNT);
    return 0;
}

// Answer: 104743

我在两个平台上都使用了 CodeBlocksEclipse

在 Linux 中 运行 很好,在 CodeBlocks 中,有:

The 10001st prime number is 104743
Process returned 35 (0x23) execution time : 0.0109 s

但不在 Windows.

然而,当我尝试在 CodeBlocks(在 Windows)中调试它时,它给了我这个 error

Program received signal SIGSEGV, Segmentation fault
调用堆栈 为:

Nr= #0 | Address= 77101566 | Function= msvcrt!modf() | File= (C:\WINDOWS\SysWOW64\msvcrt.dll:??)

Nr= #1 | Address= ?? | Function= ?? () | File= (??:??)   //I don't think this one is important :)

我尝试在 Internet 上搜索有关 SIGSEGV 错误的信息,但没有得到满意的结果。

请尽可能解释。 我将不胜感激。 :)

以下代码干净地编译,产生预期的输出,不使用递归,大大减少了 flag 值抖动的数量,将计算算法与结果显示分开,在 linux 14.04

// 10001st prime
/*
 * By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13,
 * we can see that the 6th prime is 13.
 * What is the 10001st prime number?
 */

#include <stdio.h>
#include <math.h>

#define FIRST_NUM  (2)
#define START_COUNT (0)
#define WHICH_PRIME (10001)

int prime( void )
{
    int i;
    int num = FIRST_NUM;

    for( int count = 0; count < WHICH_PRIME; )
    {
        int flag=1;
        int j = (int)sqrt((double)(num));

        for(i=2; i<=j; i++)
        {
            if( !(num%i) )
            {
                flag=0;
                break;
            }
        }

        if(flag)
        {
            count++;

            if(count==10001)
                break;
        }

        num++;
    }
    return num;
}


int main(void)
{
    int result = prime();
    printf("The 10001st prime number is %d\n", result);
    return 0;
}

// Answer: 104743