重新定义的全局变量

时间:2013-08-07 22:06:00

标签: c global-variables local-variables

我对此代码结果感到有些困惑:

#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("%d\n", g); /* so this will print "20" */

    return 0;
}

为什么结果是10不是20?

5 个答案:

答案 0 :(得分:6)

局部变量g会影响全局g

如果您希望printf()显示20,则必须使用您要打印的全局变量声明来隐藏您的本地变量g

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

答案 1 :(得分:5)

致电afunc会更改全局gmain会保留其本地g

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

*除其他外

答案 2 :(得分:2)

如果你摆脱了<{p>}中的int

int g = 10;

然后main也将引用与afunc相同的全局变量。

这称为variable shadowing

答案 3 :(得分:1)

没有修改您的代码,但已调整您的注释以指示代码正在执行的操作。顺便说一句,评论您的代码是一个非常好的主意,并提供更好的实验室分数!签署,前毕业生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("%d\n", g); /* this prints local g "10" */

    return 0;
}

考虑从主存储到全局存储的“查找”。你在全局g之前看到局部g,因此使用了局部g。

答案 4 :(得分:0)

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