4

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

#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 ?

4

5 回答 5

8

局部变量g会影响全局g

如果要显示 20,则必须使用要打印的全局变量的声明printf()来隐藏局部变量: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;
}
于 2013-08-07T22:25:31.737 回答
5

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

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

* 除其他事项外

于 2013-08-07T22:06:53.160 回答
2

如果你摆脱int

int g = 10;

那么 main 也将引用与原样相同的全局变量afunc

这称为可变阴影

于 2013-08-07T22:08:14.263 回答
1

尚未修改您的代码,但已调整您的注释以表明代码在做什么。顺便说一句,评论您的代码是一个非常好的主意,并且可以提高实验室分数!签名,前研究生助教

#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。

于 2013-08-08T06:35:14.243 回答
0

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

于 2013-08-08T10:01:26.313 回答