set :: insert产生段错11:读取大小4无效

时间:2014-05-03 05:23:58

标签: c++ windows-8 segmentation-fault valgrind archlinux

所以这是我的问题。是什么导致了代码中看似无关的变化的段错误?

#include <iostream>
#include <stdio.h>
#include <set>
#include <vector>
#include <math.h>
std::set<int> atkin(int m){
    int r=0; bool s[m+2]; std::set<int> set;
    for(int i=0;i<m+2;++i)
        s[i]=false;
    s[2]=s[3]=true;
    int xr=pow((m-1)/4,.5);
    for(int x=1;x<=xr;++x){
        int yr=pow(m-4*x*x,.5);
        for(int y=1;y<=yr;++y) {
            int n=4*x*x+y*y;
            int nm=n%12;
            if(nm==1||nm==5)s[n]=!s[n];
        }
    }
    xr=pow((m-1)/3,.5);
    for(int x=1;x<=xr;++x){
        int yr=pow(m-3*x*x,.5);
        for(int y=1;y<=yr;++y) {
            int n=3*x*x+y*y;
            int nm=n%12;
            if(nm==7)s[n]=!s[n];
        }
    }
    xr=pow(2*m/3,.5); //was xr=pow(m+1)/3,.5); <- this worked fine.
    for(int x=1;x<=xr;++x){
        int yr=pow(3*x*x-m-1,.5);
        for(int y=1;y<=yr;++y) {
            int n=3*x*x-y*y;
            int nm=n%12;
            if(x>y && nm==11)s[n]=!s[n];
        }
    }
    for(int i=5;i<=pow(m,.5);++i){
        if(s[i]){
            int k=i*i;
            while(k<=m) {
                s[k]=false;
                k+=i*i;
            }
        }
    }
    for(int i=2;i<=m;++i){
        if(s[i]) {set.insert(i); printf("%03d ", i); if(++r%20==0) printf("\n");} //segfault directs here on gdb and valgrind
    }
    return set;
}

发生了什么事?我认为这是因为xr的值较大,但我看不出它是如何连接到set.insert(i);的,这个文件也被包含在第二个调用atkin()的文件中在Windows 8和arch linux上都有这个问题。感谢您的帮助,如果我的代码以任何方式激怒您,我很抱歉。

0 个答案:

没有答案