Где хранится локальная переменная stati c? Если это сегмент данных, то почему он не является целой программой? - PullRequest
2 голосов
/ 29 апреля 2020

Если локальная переменная stati c также хранится в сегменте данных, почему значения не могут сохраняться для переменной, которая используется в двух разных функциях. Пример, подобный этому.

void func()
{  
    static int i=0;
    i++;
}

void func1()
{
 i++; // here i is stored in the data segment,
       // then the scope should be available for entire program 
}

Почему значение 'i' доступно только для области видимости блока, если оно хранится в сегменте данных? это может быть глупый вопрос, но я пытаюсь понять концепцию. Пожалуйста, помогите мне понять концепцию. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 29 апреля 2020

Необходимо различать область действия и время жизни переменной.

Простыми словами:

«область действия» означает регион вашего исходного кода , где переменная известна компилятору . Если переменная (по правилам) не видна компилятору, он откажется компилировать обращения к ней.

«время жизни» означает время, начинающееся с выделения памяти для переменной до момента, когда память присваивается другой переменной или освобождается. Переменная static живет до тех пор, пока работает программа. Переменная, не являющаяся static, живет так же долго, как и ее область действия.

Однако, только потому, что область действия и время жизни переменной «завершены», это не означает, что память исчезает. Физические клетки все еще там, и они хранят свое последнее содержимое. Вот почему вы можете программировать функции, которые возвращают указатель на некоторую локальную переменную, и извлекать содержимое этих переменных после того, как и область действия, и время жизни переменной пропали. Это прекрасный пример запутанной проблемы новичка.

Рассмотрим компилятор для встроенного процессора, подобного 8051. Конечно, довольно старая и простая машина, но хороший пример. Этот компилятор обычно помещает локальные переменные в свой сегмент данных. Но чтобы использовать ограниченное пространство памяти (всего 128 байт, включая рабочие регистры и стек), те же самые области памяти повторно используются для переменных с непересекающимися временами жизни. Несмотря на то, что вы можете получить доступ к любой памяти из всех программ.

Теперь, юристы по языкам, начните задавать мне. ; -)

0 голосов
/ 29 апреля 2020

Переменная в C состоит из двух вещей:

  • Имя, называемое идентификатором . Идентификатор имеет scope , который является областью исходного кода программы, в которой он видим (может использоваться).
  • Область памяти (память ), называется объект . Объект имеет время жизни , которое является частью выполнения программы, в течение которой для него резервируется память. Это также называется длительность хранения .

Для переменной, объявленной внутри функции, ее идентификатор имеет область видимости блока , а идентификатор виден только из ее объявление }, которое закрывает самый внутренний блок, в котором он находится. (Блок - это список операторов и объявлений внутри { и }.)

Внутри функции, объявив переменную с помощью static заставляет его объект иметь stati c продолжительность хранения , заставляя его существовать для всего выполнения программы, но это не меняет область действия его идентификатора. Объект существует во время выполнения программы, но идентификатор виден только внутри функции.

Когда вызывается другая функция, объект все еще существует (и его можно использовать, если у функции есть свой адрес, возможно, потому, что он имеет был передан в качестве параметра). Однако идентификатор переменной неизвестен внутри исходного кода других функций, поэтому они не могут использовать идентификатор.

...