【发布时间】: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/…