Переопределенная Глобальная переменная
Я немного запутался по поводу этого результата кода:
#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 (хранится в стеке), которая была объявлена локально.