繁体   English   中英

使用C中的链接列表实现Eratosthenes的筛选(分段错误)

[英]Implementing Sieve of Eratosthenes using Linked List in C (Segmentation Fault error)

我正在尝试为一个类在C中实现Sieve算法。 我不是要为我完成这项任务。 我已经写出了函数,但是当前遇到了Segmentation Fault错误。 我不是100%知道那是什么。 到目前为止,这是我的代码,任何人都可以看到此错误的来源吗?

#define EXTERN

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

void clearAll() {
    int i, j;
    seg *p;
    p = head;
    for(i = 0; i < NSegs; i++) {
            p = p -> next;
            for(j = 0; j < 256; j++) {
                    p -> bits[j] = 0;
            }
    }
}
int setBit(int n) {
   int segment, index, hold, pos, i;
   seg *p;
   p = head;

   segment = n/256;
   hold = n;
   while(hold > 65) {
        hold = hold - 65;
        index++;
   }
   pos = (hold - 1)/2;

   for(i = 0; i < segment; i++) {
        p = p -> next;
        p->bits[index] = p->bits[index] | (1 << pos);
   }
}

    int testBitIs0(int n) {
   int segment, index, hold, pos, i, r;
   seg *p;
   p = head;
   segment = n/256;
   hold = n;
   while(hold > 65) {
        hold = hold - 65;
        index++;
   }
   pos = (hold - 1)/2;
   printf("%d, %d, %d ", segment, index, pos);
   for(i = 0; i < segment; i++) {
         p = p -> next;
        r = p->bits[index] & (1 << pos);
    }
}

void sieveOfE( int N )
{
   int i, j, k;


   k = 1;   // Start with 2 to find all primes

   while ( k <= N )
   {
        for ( i = k; i <= N; i++){
          if(i % 2 == 0) {
                break;
           }
          if ( testBitIs0(i) ){
              break;
          }
        }

        for ( j = 2*i; j <= N; j = j + i ){
          setBit(j);
         }
         k = i+1;
    } 
 }

int countPrimes(int n){
    int count, i;
    count = 0;
    for(i = 0; i <= n; i++) {
       if(testBitIs0(i) ){
            count++;
       }
    }
    return count;
}

int printPrimes(int n){
        int i;
        for(i = 0; i <= n; i++) {
            if(testBitIs0(i) ){
                printf("%d ", i);
           }
        }
        printf("\n\n");

} 

链接列表已在主文件和头文件中正确初始化。 初始化来自框架文件,不应进行编辑。 但是每个链接列表节点都包含一个位数组和一个指向下一个节点的指针。

给程序员修复段错误的方法,您就可以养活他一天。 教程序员使用调试器,他将终身供职。

如果在调试器下运行程序,它将在导致该错误的代码行中捕获segfault崩溃,并且您可以检查调用堆栈。 如果使用调试器,则btbacktrace命令将显示您的堆栈。

这是GDB的花絮

正如评论中指出的那样,当您尝试取消引用无效的指针(由于多种原因未初始化,损坏或错误)时,通常会发生段错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM