Обратите внимание, как правильно отмечают комментарии, я делаю здесь допущение, предполагая, что простейший случай вызова другой функции не в том, о чем идет речь. Это предположение не было (пока) подтверждено или отклонено ОП. Этот случай обсуждается, например, в ответе Ричи.
Существование автоматических переменных существует не только для того, чтобы «в пределах» их области действия (упрощенно: только код между одним и тем же включением {}
может использовать их идентификатор), они также ограничены «во время» своей «хронологической области», то есть их время жизни (упрощается после начала выполнения кода в функции и завершения его выполнения). Доступ к ячейке памяти переменной можно получить через указатель, для которого был задан их адрес (что возможно только в пределах их области действия, поскольку необходим доступ через их идентификатор), если это происходит в течение срока их службы, да.
Но как найти этот указатель где-нибудь еще?
Возможно, будучи записанным (изнутри их области видимости и в течение их жизни) в глобальную переменную.
Но какой «другой» код должен использовать это значение? (помните, что здесь я ставлю вызов функций)
Это требует многопоточности / многозадачности / многозадачности. Допустим, существует процедура обработки прерывания. Он должен видеть то же адресное пространство, что и область действия переменных, т. Е. Никакие блоки управления памятью не мешают использовать магию виртуальной памяти. Это не так для многих реализаций нескольких типов, но, разумеется, для некоторых из них, поэтому давайте продолжим.
Этот воображаемый ISR должен был бы обеспечить доступ к автоматической переменной только в то время, когда она действительно существует (то есть в течение ее времени жизни), в противном случае он в значительной степени получал бы доступ к тому, что фактически является бессмысленной случайной ячейкой памяти. И это предполагает, что ISR фактически разрешен / может получить доступ к этой памяти. Даже без MMU есть реализации, которые могут / будут иметь исключения.
Это вводит необходимость в механизмах синхронизации, например, семафоры.
Так что в определенных средах это было бы возможно, но совершенно бессмысленно (глобальные переменные все еще задействованы), дорого, трудно понять и практически невозможно портировать. (помните, что здесь я отложил вызов функции)
Аналогично для статических переменных.
В случае локальных статических переменных функций они, по крайней мере, будут надежно существовать, но для доступа к ним по-прежнему потребуется, чтобы значение указателя было каким-то образом вывезено из их области видимости. Для статических переменных это может быть сделано через возвращаемое значение функции, как показано в ответе yashC.
В случае «статических» переменных, понимаемых как переменные, ограниченные областью видимости файла, указатель все равно должен быть перенесен из области видимости файла.
Это просто победило бы то, что, вероятно, является точкой ограниченной области видимости файла. Но я мог бы представить какую-то схему привилегий доступа, как в «Вот ключ к хранилищу. Обращайтесь осторожно».
Как уже упоминалось в начале этого ответа, я откладываю вызов других функций. Да, самый простой способ выйти из области действия функции - вызвать другую. Если эта другая функция имеет параметр указателя, она может использовать ее для доступа к чтению и записи для автоматической переменной вызывающей функции. Это обычный случай параметров вызова по ссылке, поддерживаемых C.
Вызов функции также предоставляет другой, еще более простой способ доступа к чтению значения автоматической переменной вызывающей функции, хотя не к записи и к фактическому доступу к самой автоматической переменной, только с использованием ее значения.Этот способ является тривиальным механизмом параметра вызова по значению, он даже не требует указателя.Оба способа (параметр call-by-reference и параметр call-by-value) удобно гарантируют, что значение не изменится во время выполнения вызываемой функции.(на этот раз я отложил в сторону многопоточный случай, потому что это обсуждается в основной части этого ответа).