c-重新定义的全局变量



我对这个代码结果有点困惑:

#include <stdio.h>
int g;
void afunc(int x)
{
     g = x; /* this sets the global to whatever x is */
}
int main(void)
{
    int g = 10;    /* Local g is now 10 */
    afunc(20); /* but this function will set it to 20 */
    printf("%dn", g); /* so this will print "20" */
    return 0;
}

为什么结果是10而不是20?

局部变量g遮蔽全局g

如果你想让printf()显示20,你必须用你想打印的全局变量的声明来遮蔽你的局部变量g

int main(void)
{
    int g = 10;            /* Local g is now 10 */
    afunc(20);             /* Set global g to 20 */
    printf("%dn", g);     /* Print local g, "10" */
    {
        extern int g;      /* Use global g */
        printf("%dn", g); /* Print global g, "20" */
    }
    return 0;
}

调用afunc将更改全局g,而main将保留其本地g

输入函数不会将其作用域与全局作用域交换。每个函数*都有自己的作用域。

*除其他外

如果在中去掉int

int g = 10;

那么main也将引用与CCD_ 10相同的全局变量。

这被称为可变阴影

没有修改您的代码,但已经调整了注释以指示代码正在做什么。顺便说一句,评论你的代码是一个非常好的主意,可以提高实验室成绩!!签约,前毕业生TA

#include <stdio.h>
int g;       /* define a global variable
void afunc(int x)
{
     g = x; /* this sets the global to whatever x is */
}
int main(void)
{
    int g = 10;    /* Define and set a Local g to 10 */
    afunc(20);     /* This function sets global x to 20 */
    printf("%dn", g); /* this prints local g "10" */
    return 0;
}

想想这种从主存储到全局存储的"查找"。在全局g之前可以看到局部g,因此使用了局部g。

在这两种情况下,尽管变量名称看起来相同,但它们引用了两个不同的内存区域。在任意函数外部声明的变量g存储在RAM存储区中,在main内部声明的变量g存储在堆栈区中。因此,afunc()的调用是更改存储在RAM中的变量g,但再次打印本地声明的变量g(存储在堆栈中)。

相关内容

  • 没有找到相关文章

最新更新