我想将数组填充到斐波纳契数列的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中我遇到了分段错误,我不确定它来自何处。
任何帮助都将不胜感激。
答案 0 :(得分:0)
除了以下错误外,您的程序在大多数部分都是正确的:
(1)Repalce
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];
}
}
}
答案 1 :(得分:0)
您正在传递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;
}
答案 2 :(得分:0)
你必须明白这一点: 对于数组: -
a[i] = *(a+i) // correct
所以
*a[i] = **(a+i) //pointer to pointer so it will not work in your case