首页 > 解决方案 > 在 C 中分配给静态变量的内存

问题描述

int a, b, c = 0;

void prtFun(void);

int main()
{
    static int a = 1; /* line 1 */
    prtFun();
    a += 1;
    prtFun();
    printf("\n %d %d ", a, b);
}

void prtFun(void)
{
    static int a = 2; /* line 2 */
    int b = 1;
    a += ++b;
    printf(" \n %d %d ", a, b);
}

上述程序的输出是:

4,2

6,2

2,0

局部变量一般存放在函数的栈中,全局变量和静态变量存放在进程的数据段中对吧?在那种情况下,在多个函数中具有相同的静态变量名称会导致任何冲突吗?数据段中如何引用变量?

标签: cstatic

解决方案


首先,当您提出问题时,请正确格式化您的代码

int a, b, c = 0; 

void prtFun (void); 
int main(void) 
{ 
    static int a = 1; /* line 1 */
    prtFun(); 
    a += 1; 
    prtFun(); 
    printf ( "\n %d %d " , a, b) ; 
} 

void prtFun (void) 
{ 
    static int a = 2; /* line 2 */
    int b = 1; 
    a += ++b; 
    printf (" \n %d %d " , a, b); 
} 

prtFun

b是一个自动变量,每次调用此函数时都会对其进行初始化。 a是静态局部变量,它只初始化一次,并在函数调用之间保持其值。但它的范围是函数的本地prtFun

因此,当您第一次调用它时,它a被分配 4 并被b分配 2。您打印此值

在函数中,main另一个a静态局部变量被赋值为 2(初始化 + 增量)。

当您prtFun再次调用时,您将 2 添加到函数自己的a变量中,该变量保留上一次调用 (4) 的值,结果为 6。b再次初始化为 1 并预递增 - 所以它是 2。

然后在函数 main 中打印它自己的a变量(即 2)和全局变量b ,即 0


推荐阅读