Переопределенная Глобальная переменная

Я немного запутался по поводу этого результата кода:

#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 ответов

Решение

Призвание afunc меняет глобальный g, а также main сохраняет свой местный g,

Ввод функции не меняет ее область действия на глобальную. Каждая функция * имеет свою область видимости.

* Среди прочего

Локальная переменная 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;
}

Если вы избавитесь от int в

int g = 10;

тогда main также будет ссылаться на ту же глобальную переменную, что и afunc является.

Это называется изменением теней

НЕ модифицировали свой код, но скорректировали свои комментарии, чтобы указать, что делает код. Кстати, комментирование вашего кода - это действительно хорошая идея, которая помогает улучшить результаты в лаборатории! подписано, Бывший выпускник 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.

В обоих случаях, хотя имя переменной кажется одинаковым, они 2 относятся к двум различным областям памяти. Переменная g, объявленная вне любой функции, хранится в области оперативной памяти, а переменная g, объявленная внутри main, сохраняется в области стека. Таким образом, вызов afunc () изменяет переменную g, хранящуюся в RAM, но снова печатает переменную g (хранится в стеке), которая была объявлена ​​локально.

Другие вопросы по тегам