【问题标题】:C Fibonacci Sequence in Array Segmentation Fault数组分段错误中的 C 斐波那契数列
【发布时间】:2017-01-24 16:57:45
【问题描述】:

我想填充一个最多 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 中我遇到了分段错误,我不确定这是从哪里来的。

任何帮助将不胜感激。

【问题讨论】:

  • 你知道如何使用调试器吗?
  • 可能是seq = malloc(sizeof(int)*n); --> *seq = malloc(sizeof(int)*n);, *seq[0] = 0; --> (*seq)[0] = 0; ((*seq)[1] = 1; ...)
  • 什么是seq[0]?以及seq[1] 等。这些都是指向内存的指针。他们初始化了吗?不。你能安全地取消引用它们吗?
  • 不,我对 C 和命令行比较陌生
  • 你应该一定学习如何使用调试器。此外,对于新手来说,GUI 调试器将变得非常容易学习 - 命令行调试器对于初学者来说通常更难使用。

标签: c fibonacci


【解决方案1】:

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

(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];
        }

    }
}

【讨论】:

  • 查看我的回答,希望对您有用
  • 我想从 main 调用函数为:int *fib_sequence; fib(&amp;fib_sequence, 5);
  • 当然。在这种情况下,您仍然需要像 int * fib_sequence = malloc(sizeof(int)*5); 一样为 fib_sequence 分配内存。然后在函数调用后读取值时,您可以执行for(int x = 0; x &lt; 5; x++) printf("%d", fib_sequence[x]);
【解决方案2】:

您正在传递pointer of pointer,即void 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;
}

【讨论】:

    【解决方案3】:

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

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

    所以

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

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多