添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

SIGSEGV,虽然在Linux中运行正常,但在Windows中出现分段故障

1 人不认可
// 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

I used both CodeBlocksEclipse在这两个平台上。

It is running fine in Linux, in CodeBlocks, with:

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

But not in Windows.

However, when I tried to debug it in CodeBlocks(在Windows中)它给了我这个error:

Program received signal SIGSEGV, Segmentation fault
and call stack as: 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 :)

我试图在互联网上搜索有关SIGSEGV错误的信息,但无法得到满足。

请尽可能多地解释。 我将非常感激。)

5 个评论
分段故障很可能指向未定义的行为,这也会导致预期的行为。因此,如果它在一个操作系统下可以工作,但在另一个操作系统上不能工作,你不能断定代码的正确性是取决于操作系统的。
你没有返回任何值,你没有改变任何东西,你只是向下潜入10000次左右,然后退出,所以递归本质上是无用的。
@cad 好吧,请告诉我这里有什么问题,真的?我想这是一个非常基本的代码,没有涉及到重的东西。
堆栈溢出,我敢肯定。递归在Windows上炸毁了你的堆栈。显然,你的Linux版本有更多的堆栈空间。
我对你的程序做了一个快速修改,以确定递归的深度。它递归了104741个调用的深度。这是个很大的问题。这可能是一个堆栈空间问题,至少在Windows上是这样。在Linux上,它可能是一个问题,但可能没有表现为分段故障。补充一下@MarcB的观点,使用递归不仅仅是一个品味问题。它是实现这种算法的一种糟糕的方式,很可能导致你的问题。
c
linux
windows
pointers
codeblocks
Sachin
Sachin
发布于 2016-01-30
1 个回答
user3629249
user3629249
发布于 2016-01-30
已采纳
0 人赞同

下面的代码编译干净,产生了预期的输出,不使用递归,大大减少了 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);