在递归函数中,每个递归函数调用中的局部变量都存储在堆栈中但是如果我声明一个全局变量并在递归函数中使用它会发生什么?如何处理全局变量?
阶乘的通常代码是
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);
}
我直截了当地知道代码是错误的,我只是修改它来检查会发生什么。结果是分段错误请解释我这里发生了什么,可能是编译器如何表现?
答案 0 :(得分:0)
全局变量存储在data segment
中,而局部变量(在函数中声明和定义)存储在stack
中。它们在函数返回后消失。
您可以找到详细信息here
答案 1 :(得分:0)
存储类决定变量的范围和可见性。局部变量的类型为“auto”,因此存储在堆栈段中。而全局变量和静态变量存储在数据段中。局部变量的范围和可见性受限于它们所定义的块或函数内。因此,每次调用函数时都会加载新的局部变量集。在全局变量的情况下,范围保持到程序的生命周期。