从不兼容的指针类型传递“斐波那契”的参数 2

Passing argument 2 of 'fibonacci' from incompatible pointer type

提问人:somebody 提问时间:9/17/2022 最后编辑:Vlad from Moscowsomebody 更新时间:9/18/2022 访问量:50

问:

#include <stdio.h>
#include <stdlib.h>

//Fibonacci

void fibonacci(int n, int *fibs[n]){

    int i;
    *fibs[0] = 1;
    *fibs[1] = 1;

    printf("%d %d ", *fibs[0], *fibs[1]);

    for(i=2; i<=n; i++){
        *fibs[i] = *fibs[i-1] + *fibs[i-2];
        printf("%d ", *fibs[i]);
    }   
}

int main(){

    int n, i;

    printf("How many fibonacci numbers do you want to enter?: ");
    scanf("%d", &n);
    int fibs[n];

    fibonacci(n, &fibs);
    
    return 0;
}

我以这种方式编写斐波那契程序。程序运行,但不打印任何内容。我收到这样的错误,我怎样才能修复这个程序才能有效运行?[Warning] passing argument 2 of 'fibonacci' from incompatible pointer type

C 参考传递斐 波那契 按值传递 函数定义

评论


答:

0赞 Vlad from Moscow 9/17/2022 #1

您声明了一个可变长度数组

int fibs[n];

在此电话会议中

fibonacci(n, &fibs);

该参数的类型为 。int ( * )[n]

但是,对应的功能参数

void fibonacci(int n, int *fibs[n]){

具有类型(由于编译器将具有数组类型的参数调整为指向数组元素类型的指针)。int **

因此,编译器发出消息。

函数声明可以简单得多

void fibonacci(int n, int fibs[n]){

在这种情况下,该函数的调用方式如下

fibonacci(n, fibs);

当然,您需要更改函数的主体。

注意这个循环

for(i=2; i<=n; i++){

当 等于 时,可能会导致访问传递的数组之外的内存,因为索引的有效范围为 。in[0, n)

前两个斐波那契数列是 和 。01

即使在功能的最初阶段

int i;
*fibs[0] = 1;
*fibs[1] = 1;

需要检查n是否不小于2。

例如,该函数可以看起来像

void fibonacci( int a[], size_t n )
{
    if ( !( n < 1 ) ) a[0] = 0;
    if ( !( n < 2 ) ) a[1] = 1;

    for ( size_t i = 2; i < n; i++ )
    {
        a[i] = a[i-1] + a[i-2];
    }
}

并称

size_t n = 0;

printf("How many fibonacci numbers do you want to enter?: ");
scanf( "%zu", &n );

if ( n != 0 )
{
    int fibs[n];

    fibonacci( fibs, n );
}