2015-04-12 3 views
-2

я пытался что-то вроде этого:Определение глобальной переменной в качестве локальной переменной в с

int globalvar=10; 

void print() 
{ 
    printf("%d \n",globalvar); 
} 

int main(){ 
    int globalvar=5; 
    printf("%d \n",globalvar); 
    print(); 
    while (1); 
    return 0; 
} 

, а затем выход пошел, как этот

5  
10 

Я сделал вывод, что C создал локальный экземпляр «globalvar» внутри main и инициализируется значением 10, которое распечатывается printf.

Я хорошо с этой точкой, но я запуталась с некоторыми новыми точками:

  1. globalvar который инициализируется перед основнымами, как предполагается, объем повторяющихся программ с его месторасположением же память в DS , что происходит в том случае, когда существует переменная с тем же именем, которая определена локально в функции (например: main),?

  2. Второй вопрос связан с компоновщиком: как линкер связан с этими двумя переменными с одинаковыми именами, чтобы он выполнялся так, как он выполнялся?

PS: После того, как downvoting вопрос, я хочу сказать, что я действительно искал этот вопрос, и я не нашел подобный вопрос, и я подумал, что задать вопрос, как это будет полезно для других. Я хочу Я не misunderstod

+3

Вы - имена переменных _shadowing_ в области видимости. Компилятор должен предупредить вас об этом, указав все уровни предупреждения. –

ответ

7

я пришел к выводу, что C создал локальный экземпляр «globalvar» внутри основной и инициализируется со значением 10, который распечатывается на Printf.

Нет, вы создали локальную переменную с именем globalvar инициализируется 5. Затем вы можете использовать его в printf. print() не имеет никакого представления о том, что переменная, и использует глобальный один набор до 10.

, что это происходит в том случае, когда есть переменная с таким же именем определяется локально в функции (например: основной) ,?

Локальные переменные имеют преимущество. Если вы хотите использовать глобальную переменную, вы должны назвать свою локальную переменную чем-то другим, чтобы она не конфликтует.

Это все в одном файле, поэтому компоновщик не имеет отношения к взаимодействию этих двух переменных вообще.

+0

Я понимаю, что есть намного больше, чем это, но лучше не вдаваться в подробности здесь, я думаю. –

+0

Еще одна деталь, о которой я хочу спросить: globalvar определен как в стеке (в случае его локального), так и в сегменте данных (в случае его глобального), , так что правильно сказать, что приоритет всегда предоставляется стек? –

+1

@MohamedElShenawy Технически да, но я не думаю, что это правильный способ подумать об этом, потому что область применения также относится к стеку - вы можете иметь две переменные с тем же именем в стеке. Скомпилированная программа также не будет использовать «имена», просто адреса и места хранения, поэтому не имеет значения, имеют ли переменные одинаковые имена или разные. –

1

Сначала вызывается printf в main. Он выводит 5 - значение локальной переменной, заданное в main.

Затем вызывается print, и он вызывает printf для вывода значения глобальной переменной.

Linker не может беспокоиться о том, что он не имеет отношения к локальным переменным вообще, к ним нельзя получить доступ по имени из-за функции, в которой они объявлены, поэтому имя локальной переменной обычно не видно даже компоновщик.

1

Ваша локальная переменная переопределяет вашу глобальную переменную внутри функции.И объем локальной переменной закончится, как только объем вашей функции закончится. Поэтому, если вы вызываете другую функцию, у которой нет локальной переменной с тем же именем, вы можете увидеть значение глобальной переменной.

Линкер не играет никакой роли в этой функции. Эта функция управляется областью действия переменной в программе.

Смежные вопросы