段错误,哪里有越界访问呢?

 

//接收N,生成素数序列arr[2N],其中素数最大素数小于2N,
//for循环用公式计算d[2N],
//for循环判断d是否为2,并用sum统计
#include<cstdio>

int n=0;
int len=3;//arr长度
int sum=0;//素数对数目
int arr[10000]={0};

void primenum(int n,int arr[]);
int main(void)
{
    scanf("%d",&n);

    if(n<5) {
      printf("%d",0);
        return 0;
    }
    arr[0]=2;
    arr[1]=3;
    arr[2]=5;
    
    primenum(n, arr);
    
   // int d[len+100]={0};
    for(int i=0;arr[i+1]<n+1;i++){
      //  d[i]=arr[i+1]-arr[i];
     //   if(d[i]==2) sum++;
        if((arr[i+1]-arr[i])==2) sum++;
    }
    printf("%d", sum);
    
    return 0;
}

void primenum(int n, int arr[]){
    for(int i=6;i<2*n;i++){//从6开始生成素数
        bool flag= true;
        for(int j=0;j<len;j++){
            if(i % arr[j] ==0){
                flag=false;
                break;
            }
        }
        if(flag == true){
        	len++;
        	arr[len-1]=i;
    	}
	}
}

 

 

 

我拷贝了代码运行了一下,没问题啊,50000以内都没问题。

楼主的arr数组太大了,不知道会不会是这个问题,我之前定义过大数组出现段错误。

如果是因为数组太大,可以把arr改成int型指针,用malloc()分配内存空间。

int *arr;//原int arr[10000]={0};

arr = (int *)malloc(10000*sizeof(int));//include<string>给arr分配内存  

memset(arr,0,10000*sizeof(int));//include<stdio.h>赋值0

没必要按引用调用

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y