статические переменные в с - PullRequest
5 голосов
/ 18 января 2011

Статические переменные, когда они объявлены в файле, недоступны извне файла. Но если мы объявим статическую переменную внутри файла и глобальный указатель, а затем назначим указателю адрес статической переменной, а затем добавим указатель на нее, к ней можно получить доступ.

Так правильно ли говорить, что к статическим переменным нельзя получить прямой доступ, но к ним можно получить косвенный доступ, используя глобальные указатели, а затем извне?

Ответы [ 5 ]

10 голосов
/ 18 января 2011

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

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

Например, когда вы объявляете два extern имен переменных a в разных единицах перевода, эти переменные на самом деле одинаковы, одна переменная . Когда вы объявляете две static переменные с именем a в разных единицах перевода, эти переменные две разные независимые переменные . Это то, что static делает в C. Ничего другого.

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

6 голосов
/ 19 января 2011

Представьте имена переменных статических и внешних связей как адреса, такие как «дом Мэдди» и «123 foo street», соответственно. Первое имеет значение только для людей, которые знают вас, в то время как второе имеет значение и для других в связи с установленным соглашением. Но даже если у «дома Мэдди» нет адреса улицы, у него все равно есть широта и долгота, которые вы можете дать кому-то, кто хочет запустить ракету. :-)

2 голосов
/ 19 января 2011

Статическое ключевое слово в 'C' просто ограничивает область видимости переменной этой конкретной единицей перевода (т. Е. Этим файлом 'C'). Другими словами, это ограничивает связывание этой переменной. И ничего больше. И в C все Статические, глобальные и автоматические переменные могут быть доступны через указатели в их жизни. Нет способа предотвратить это.

1 голос
/ 18 января 2011

Доступ к чему-либо внутри процесса может быть получен, если у вас есть указатель на него, за исключением специфических для архитектуры механизмов ограничения доступа. Излишне говорить, что переменная может быть доступна через указатель, излишне.

0 голосов
/ 18 января 2011

К переменной нельзя получить доступ, и имя этой переменной не будет конфликтовать, и никто не сможет найти символ этой переменной.

Но, конечно, вы всегда можете получить к нему доступ через указатель,Доступ ко всей памяти (стек + куча) процесса можно получить с помощью указателей, и предотвратить это невозможно.

Использование статической переменной не является безопасным для предотвращения доступа к ней извне модуля.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...