分段错误

时间:2015-05-08 14:18:53

标签: c++ c segmentation-fault

我尝试使用以下代码判断素数:

const int N = 200000;
long prime[N] = {0};
long num_prime = 0;
int is_not_prime[N]={1,1};
void Prime_sort(void)
{
    for( long i = 2 ; i<N ; i++ )
    {
        if( !is_not_prime[i] )
        {
            prime[num_prime++] = i;
        }
        for( long j = 0; j<num_prime && i*prime[i]<N ; j++ )
        {
            is_not_prime[i*prime[j]] = 1;
        }   
    }   
}

但是当我运行它时,会导致分段错误! 我从未见过的那个错误。我搜索了谷歌,它解释了分段错误如下:

  

分段错误(通常缩写为段错误)是一个特殊的问题   计算机运行期间可能出现的错误情况   软件。简而言之,当程序发生分段故障时   尝试访问不允许访问的内存位置,   或尝试以不允许的方式访问内存位置

但我不知道在我的代码中导致此错误的位置。请帮助我。

3 个答案:

答案 0 :(得分:4)

你的数组is_not_prime的长度为N.例如,在外部for循环的最后一圈,我将得到值N-1。当i很大时,is_not_prime[i*prime[j]]将导致您写出远离数组的边界。

我不太确定j<num_prime && i*prime[i]<N应该做什么,但它可能是bug的一部分。使用调试器单步执行程序,并查看程序崩溃时变量的值。

只需以较简单的方式重写您的程序,所有错误都会消失。

答案 1 :(得分:1)

将循环边界检查与索引进行比较 - 它们不相同。 (我相信你的意思是在你的<td align="center"><span class="glyphicon" title="test" ng-class="{'glyphicon-ok' : user.StatusID == 1, 'glyphicon-remove' : user.StatusID == 2, 'glyphicon-lock' : user.StatusID == 3}"></span></td> 循环中写i*prime[j]<N。)

答案 2 :(得分:1)

您的程序崩溃,因为索引超出范围。并且索引超出范围,因为您的算法无效。

如果你将N设置为更小的值

,它仍然会崩溃
const int N = 3;
用铅笔和纸张运行你的程序不会太难看出会出现什么问题......