gpt4 book ai didi

c - 在 C 中使用链表实现 Eratosthenes 筛法(Segmentation Fault 错误)

转载 作者:太空宇宙 更新时间:2023-11-04 06:00:14 25 4
gpt4 key购买 nike

我正在尝试用 C 语言为一个类实现 Sieve 算法。我不是要求为我完成这项任务。我已经写好了我的函数,但目前遇到了段错误。我不是 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");

}

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

最佳答案

为程序员提供一个段错误修复程序,您将供他使用一天。教一个程序员使用调试器,他就能养活自己一辈子。

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

Here is a GDB turorial .

正如评论中所指出的,段错误通常发生在您尝试取消引用无效指针时,无论是未初始化的、损坏的还是出于多种原因的错误。

关于c - 在 C 中使用链表实现 Eratosthenes 筛法(Segmentation Fault 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20482108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com