数组分段错误中的 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 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;
}
你必须明白这一点:
对于数组:-
a[i] = *(a+i) // correct
所以
*a[i] = **(a+i) //pointer to pointer so it will not work in your case
我想填充一个数组,最多为 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 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;
}
你必须明白这一点: 对于数组:-
a[i] = *(a+i) // correct
所以
*a[i] = **(a+i) //pointer to pointer so it will not work in your case