数组分段错误中的 C 斐波那契数列

C Fibonacci Sequence in Array Segmentation Fault

我想填充一个数组,最多为 n 位斐波那契数列。这是我目前拥有的:

void fib(int **seq, int n){
    seq = malloc(sizeof(int)*n);

    if(n==1){
        *seq[0] = 0;
    }

    if(n==2){
        *seq[0] = 0;
        *seq[1] = 1;
    }

    if(n>=3){
        *seq[0] = 0;
        *seq[1] = 1;
        *seq[2] = 1;
        for(int i=3; i<n; i++){
            *seq[i] = *seq[i-1]+*seq[i-2];
        }

    }
}

我已经在 Python 中测试了基本算法并且它按预期工作,但是在 C 中我遇到了分段错误并且我不确定这是从哪里来的。

如有任何帮助,我们将不胜感激。

除了以下错误外,您的程序大部分都是正确的:

(1) 替换

seq = malloc(sizeof(int)*n);

*seq = malloc(sizeof(int)*n);

请注意,您不应将内存分配给双指针。您应该将内存分配给 'seq'.

指向的指针

(2) 替换所有像

这样的语句

*seq[i]...

(*seq)[i]

请注意,[] 比 * 具有更强的亲和力。因此,您需要在所有实例上用括号将 *seq 括起来。

(3) 您还没有说明如何调用此函数。但我假设您在调用函数之前将内存分配给双指针。

这里有一个工作程序供您参考:

#include <stdio.h>

void fib(int **seq, int n);

int main()
{
    int ** sequence = malloc(sizeof(int*));       

    fib(sequence, 5);
    for(int x = 0; x < 5; x++)
       printf("%d", (*sequence)[x]);
    return 0;
}

void fib(int **seq, int n){
    *seq = malloc(sizeof(int)*n);

    if(n==1){
        (*seq)[0] = 0;
    }

    if(n==2){
        (*seq)[0] = 0;
        (*seq)[1] = 1;
    }

    if(n>=3){
        (*seq)[0] = 0;
        (*seq)[1] = 1;
        (*seq)[2] = 1;
        for(int i=3; i<n; i++){
            (*seq)[i] = (*seq)[i-1]+(*seq)[i-2];
        }

    }
}

您正在通过 pointer of pointervoid fib(int **seq, int n) 而不是尝试分配内存 seq = malloc(sizeof(int)*n); 这是错误的

除了这样做你可以简单地做

void fib(int *seq, int n){



if(n==1){

    seq[0] = 0;
}

if(n==2){
    seq[0] = 0;
    seq[1] = 1;
}

if(n>=3){
    seq[0] = 0;
    seq[1] = 1;
    seq[2] = 1;
    for(int i=3; i<n; i++){

        seq[i] = seq[i-1]+seq[i-2];
    }

}
}
int main()
{

int n=10;
int *arr=(int*)malloc(sizeof(int)*(n)); // Allocate memory here 
fib(arr,10);
for(int i=0;i<10;i++)
    cout<<arr[i]<<" ";


return 0;
}

你必须明白这一点: 对于数组:-

a[i] = *(a+i) // correct

所以

*a[i] = **(a+i) //pointer to pointer so it will not work in your case