我使用代码 1 出现分段错误的原因可能是什么

What could be the reason I am getting segmentation fault using code 1?

本文关键字:是什么 错误 分段 代码      更新时间:2023-10-16
筛子的

埃拉托色尼方法:当我使用代码 1 过滤质数时,我得到了输入16777214的分割错误,而在代码 2 中它不会给出分割错误。分割错误是由于代码 1 的前 2 行,其中我定义了 (bool prime( 和 (memset(。我得到这个错误的原因可能是什么 https://www.interviewbit.com/problems/prime-sum/

//code 1:
vector<int> Solution::primesum(int A){
    bool prime[A+1];
    memset(prime, true, sizeof(prime));
    for (int p=2;p<=sqrt(A);p++){
        if(prime[p] == true){
            for (int i=p*p;i<=A;i+=p)
                prime[i] = false;
        }
    }
}
````
````
//code 2:
vector<int> Solution::primesum(int A){
    vector<bool> prime(A+1);
        for(int i=2;i<=sqrt(A);i++){
            if(prime[i]==false){
                for(int j=i*i;j<=A;j+=i)
                    prime[j] = true;
            }
        }
}
````
````

假设变量A在创建数组之前初始化,数组的内存在堆栈上分配,并且由于堆栈的大小有限,为 16777214 字节分配内存可能会导致堆栈溢出,从而导致分段错误。

另一方面,向量在堆上分配,不会发生相同的问题。

PS:可变长度数组不是标准C++,GCC 将它们实现为非标准扩展。

当任一数组超出索引并且您正在访问非法内存空间时,会发生分段错误。

首先,数组不能以这种方式动态启动。你应该尝试这种方式,

int *prime = new int[length];

其次,也许是为了你的,prime[n+1],您的输入值超出了"n"(整数(的限制。 由于您使用的是数据类型int并且它具有内存限制。尝试使用 long int .