提问人:somebody 提问时间:9/17/2022 最后编辑:Vlad from Moscowsomebody 更新时间:9/18/2022 访问量:50
从不兼容的指针类型传递“斐波那契”的参数 2
Passing argument 2 of 'fibonacci' from incompatible pointer type
问:
#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
答:
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++){
当 等于 时,可能会导致访问传递的数组之外的内存,因为索引的有效范围为 。i
n
[0, n)
前两个斐波那契数列是 和 。0
1
即使在功能的最初阶段
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 );
}
评论