Fibonacci和数组返回

时间:2011-04-21 06:54:55

标签: c arrays function pointers return

long fibonacci(int ceiling)
{
  int counter;
  long num1 = 1, num2 = 1, sum;
  int arr[ceiling+1];
  for (counter = 1; counter < ceiling; counter++)
    {
      arr[counter] = num1;
      //printf("%d\n", num1); //prints sequence
      sum = num1+num2;
      num1 = num2;
      num2 = sum;
    }
  return arr;
}

现在,如果我尝试访问此数组,请使用int a = fibonacci(10);,它就没有投诉。但是,如果我尝试访问单个元素,例如a[1],它会告诉我

  

下标值既不是数组也不是指针

我做错了什么?

7 个答案:

答案 0 :(得分:4)

  

..如果我尝试访问一个单独的元素,如[1],或者其他东西..

int a = fibonacci(10);

a是一个整数变量,而不是在其上使用运算符[]的数组。

方法定义应为 -

int* fibonacci(int ceiling)
{
    // ...
    return arr ;
}

int *a = fibonacci(10) ;

现在,您可以在[]上使用a运算符。 然而,你要返回的是一个局部变量(即驻留在堆栈上)的引用,这是错误的。您应该使用malloc为数组动态分配内存,并且应该稍后free

答案 1 :(得分:2)

不能从C(或C ++)中的函数返回一个数组。

您的代码当前所做的是:它隐式地将int []数组衰减为int *指针,然后隐式地将int *强制转换为long,然后返回long。这不是指针或数组,因此下标操作符可能不适用于它。

你可以返回一个int *,但返回一个指向本地arr数组的指针是错误的(你的编译器可能无法捕获错误,但你会调用未定义的行为在运行时)因为一旦函数完成,arr 正式不存在,因此返回的指针悬空。

你可以:

  • 使用malloc()分配一个数组并返回指针(但是你必须弄清楚谁将要释放()分配,并确保只发生一次);或

  • 传入一个指向数组的指针,并通过该指针填充数组(现在调用者负责创建和管理数组) - 这可能是C中的常用方法;或

  • 创建一个包装数组的结构,并返回其中一个(或者,就此而言,将指针传递给一个)。

另请注意int arr[ceiling + 1];是C99构造;它不允许使用标准的“传统”C(C89等),也不允许使用符合标准的C ++。在这些语言中,必须在编译时知道数组的大小。

在C ++中,您也可以通过引用传递数组,或者使用boost::array(“包装数组的结构”,但也使用运算符重载使其表现得像数组一样透明)。 / p>

答案 2 :(得分:1)

解决此问题的最简单方法是在调用站点分配数组并将其传递给要填充的斐波那契函数。

void fibonacci(int n, int arr[])

答案 3 :(得分:0)

你应该返回一个int [],而不是长

编辑: 对不起,混合C#:)

int* fibonacci(int ceiling)
....

//调用

int *a = fibonacci (10);
int val = a[20];

答案 4 :(得分:0)

它应该返回一个long *,并且arr应该是long *从堆中获取内存,因为a)你希望你的数组在函数返回后保持不变并且b)你的所有操作数都是long类型:

long* fibonacci(int ceiling)
{
  int counter;
  long num1 = 0, num2 = 1, sum; //F is seeded with F(0) = 0, F(1) = 1
  long* arr = malloc((ceiling+1)*sizeof(long));
  //include ceiling in the loop since you have ceiling+1 elements
  for (counter = 0; counter <= ceiling; counter++)
    {
      arr[counter] = num1;
      //printf("%d\n", num1); //prints sequence
      sum = num1+num2;
      num1 = num2;
      num2 = sum;
    }
  return arr;
}

答案 5 :(得分:0)

更重要的是,你应该考虑内存分配。 仅使用int arr[ceiling+1];将为具有此函数范围的变量创建内存。因此,您可以返回指向内存位置中可能被覆盖的数组的指针。 请改用malloc

答案 6 :(得分:0)

修复了错误的更好版本:

#include <stdio.h>
int fibonacci(int ceiling, int *arr)
{
  int counter;
  long num1 = 1, num2 = 1, sum;
  if(arr == NULL)
      return -1;
  for (counter = 0; counter < ceiling; counter++) {
      arr[counter] = num1;
      //printf("%d\n", num1); //prints sequence
      sum = num1+num2;
      num1 = num2;
      num2 = sum;
  }
  return 0;
}
int main (int argc, char const* argv[])
{
    int ceiling = 10;
    int arr[ceiling + 1];
    fibonacci(ceiling, arr);
    return 0;
}