簡體   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