где глобальные и локальные переменные хранятся в памяти в C - PullRequest
0 голосов
/ 21 мая 2019

Я работаю с Aurix MUC, я пытался прочитать содержимое памяти после выполнения программы, чтобы увидеть, что он написал в мемуарах

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

Вот пример:

int a = 100;

void plus (int a)

{

 a = a + 17;

}

int main (void)

{

 plus(a);

 return 0;

}

когда я отображаю содержимое памяти, я нахожу значение 100

и я не могу найти новое значение a, которое обычно равно 117.

Я пытался объявить переменную a как volatile, но это ничего не меняет

с другой стороны, если я делаю вычисления непосредственно в основном, как это

int a = 100;

int main (void)

{

 a = a + 17

 return 0;

}

вот так я нахожу в памяти значение 117.

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

и почему новая переменная a не записывается в память,

и почему переменные, объявленные в local, также не записываются в память?

1 Ответ

1 голос
/ 21 мая 2019

В этом коде:

int a = 100;

void plus(int a)
{   
    a = a + 17;
}

int a в void plus(int a) объявляет новый экземпляр a, который скрывает предыдущий a. Затем в a = a + 17; используется этот новый экземпляр a. Чтобы plus изменил a, объявленный вне функции, используйте:

int a = 100;

void plus(void)
{
    a = a + 17;
}

Кроме того, в main измените plus(a); на plus();.

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

Поскольку int a = 100; имеет область видимости файла, вам не нужно повторно объявлять его в plus, чтобы использовать его - он виден внутри функции, поэтому вы можете просто использовать его без нового объявления.

...