首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现函数返回后不被销毁的stackframe?

如何实现函数返回后不被销毁的stackframe?
EN

Stack Overflow用户
提问于 2019-03-27 20:36:33
回答 5查看 77关注 0票数 0

我试图将斐波那契级数的元素存储在数组中,该数组位于函数内部,在通过"return arr“从函数返回后,我的堆栈框架被销毁,并且我无法在main函数中接收值。我只想使用递归和从main函数打印,这些都是我的条件。

代码语言:javascript
运行
复制
#include <stdio.h>

int *fib(int *num, int *first, int *second, int i, int *arr);

int main()
{
  int num;
  printf("Enter any number : \n");
  scanf("%d", &num);
  int first = 0, second = 1, i = 0;
  int arr[num];
  int *result = fib(&num, &first, &second, i, arr);
  for (int i = 0; i < num; i++)
    printf("%d ", result[i]);
}

int *fib(int *num, int *first, int *second, int i, int *arr)
{
  int temp;
  if (*first == 0)
    printf("%d ", *first);
  if (*num < 0)
  {
    if (*second == 1)
      printf("%d ", *second);
    temp = *first - *second;
    *first = *second;
    *second = temp;
    if (*second > *num && *second < -*num)
    {
      *(arr + i) = *second;
      return fib(num, first, second, i++, arr);
    }
    else
      return arr;
  }
  else
  {
    temp = *first + *second;
    *first = *second;
    *second = temp;

    if (*second >= *num + 3)
      return arr;
    else
    {
      *(arr + i) = *second;
      return fib(num, first, second, i++, arr);
    }
  }

  printf("\n");
}
EN

回答 5

Stack Overflow用户

发布于 2019-03-27 20:41:54

你不能这么做。

您试图与堆栈帧是什么的定义作斗争,但您正在失败。

你永远都会输!

相反,根据语言的规则和规范,正确地构建您的程序,以便以您需要的方式传递数据。

票数 4
EN

Stack Overflow用户

发布于 2019-03-27 22:18:51

你完全可以在不保护函数栈框的信息的情况下实现你想做的事情,因为我不认为你的错误与此有任何关系。也就是说,与迭代方法相比,使用斐波那契数进行递归是没有意义的,它只会在不需要的时候发送额外的堆栈。

我从Jabberwocky的回答中获得了灵感,并用“递归”做了一个例子,尽管它最终只是一个花哨的for循环。

代码语言:javascript
运行
复制
#include <stdio.h>

void fib(int num, int *arr, int pos);

int main()
{
  int num;
  printf("Enter any number : \n");
  scanf("%d", &num);

  int arr[num];
  if (num > 1) {
    arr[0] = 0 ;
    arr[1] = 1 ;
  }
  int pos = 2;
  fib(num, arr, pos);

  for (int i = 0; i < num; i++)
    printf("%d ", arr[i]);
}

void fib(int num, int *arr, int pos)
{
  if (pos < num && pos > 1)
  {
    arr[pos] = arr[pos - 2] + arr[pos - 1];
    fib(num, arr, pos + 1);
  }  
  else {
      return;
  }
}

这会将所有值存储到在main中分配的arr中,因此删除stackframes没有任何影响。fib函数即使在递归时也不需要返回任何东西,因为它有数组指针,可以直接更改数组的值。当然,需要更多的错误检查,但我认为这足以让人理解这个想法。

票数 1
EN

Stack Overflow用户

发布于 2019-03-27 21:07:47

有点离题,但您可能只是想要这样:

代码语言:javascript
运行
复制
#include <stdio.h>

void fib(int num, int *arr);

int main()
{
  int num;
  printf("Enter any number : \n");
  scanf("%d", &num);

  int arr[num] = { 0, 1 } ;
  fib(num, arr);

  for (int i = 0; i < num; i++)
    printf("%d ", arr[i]);
}

void fib(int num, int *arr)
{
  for (int i = 0; i < num; i++)
  {
    arr[i + 2] = arr[i] + arr[i + 1];
  }  
}

在这里使用递归是非常没有意义的。这是未经测试的代码,可能有bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55377363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档