【问题标题】:Storage of global variables in recursive function calls in memory在内存中的递归函数调用中存储全局变量
【发布时间】:2014-10-26 08:40:29
【问题描述】:

在递归函数中,每个递归函数调用中的局部变量都存储在堆栈中,但是如果我声明一个全局变量并在递归函数中使用它会发生什么?全局变量如何处理?

阶乘的通常代码是

int fact (int n)
{
  if(n<1) return 1;
      else return (n*fact(n-1));
}

在阅读计算机体系结构时,我研究了局部变量从高地址到低地址存储在堆栈中,堆是从低地址开始的动态结构,全局变量是分开存储的。

所以我把它修改为

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

int global=0;

int fact()
{
  if(global<1)return 1;
  else
      return((global--)*fact());
}

main()
{
  int i=0;
  printf("enter the factorial\n");
  scanf("%d",&global);
  i=fact();
  printf("%d\n",i);
} 

我直观地知道代码有问题,我只是将其修改为这个以检查会发生什么。结果是分段错误请解释一下这里发生了什么,可能编译器对此有何表现?

【问题讨论】:

  • 递归函数没有什么特别之处。它们的工作原理与非递归函数完全相同。
  • 全局变量在程序的整个生命周期中都存储在同一个内存地址。无论您在哪里使用它们,它们的位置都不会改变。
  • @Mat 我已经分享了通常阶乘的 ARM 汇编代码,它清楚地解释了发生了什么,如果有人擅长 ARM 汇编语言,请解释修改后的代码中出现的问题在 ARM 方面是错误的汇编语言 [链接]docs.google.com/document/d/…

标签: c memory recursion


【解决方案1】:

全局变量存储在data segment,而局部变量(在函数中声明和定义)存储在stack。它们在函数返回后消失。 你可以找到详情here

【讨论】:

  • 请找到您的来源,其中的全部部分是从this复制/粘贴的
【解决方案2】:

存储类决定变量的范围和可见性。局部变量的类型为“auto”,因此存储在堆栈段中。而全局和静态变量存储在数据段中。局部变量的范围和可见性受限于定义它们的块或函数内部。因此,每次调用函数时都会加载新的局部变量集。如果是全局变量,则范围会一直保留到程序的生命周期。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2021-12-07
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2017-10-03
    相关资源
    最近更新 更多