Когда это в порядке для использования глобальной переменной в C?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

47
задан casperOne 6 April 2012 в 17:51
поделиться

12 ответов

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

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

я не могу согласиться с "никогда", оператор также, Как любые другие глобальные переменные понятия инструмент, который должен использоваться при необходимости. Я использовал бы глобальные переменные, чем использовал бы некоторые искусственные конструкции (как раздавание указателей), который только замаскировал бы реальное намерение. Хорошими примерами, где глобальные переменные используются, являются реализации шаблона "одиночка" или доступ регистра во встроенных системах.

На том, как на самом деле обнаружить чрезмерные использования глобальных переменных: контроль, контроль, контроль. Каждый раз, когда я вижу глобальную переменную, я должен спросить меня: это ДЕЙСТВИТЕЛЬНО необходимо на глобальном уровне?

51
ответ дан Dan Cristoloveanu 26 November 2019 в 19:26
поделиться

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

Глобальные переменные имеют некоторое использование, например, если операция многих частей программы зависит от конкретного состояния в конечном автомате. Пока Вы ограничиваете количество мест, которые могут ИЗМЕНИТЬ переменную, разыскивающую ошибки, включающие его, не слишком плохо.

Глобальные переменные становятся опасными почти, как только Вы создаете больше чем один поток. В этом случае действительно необходимо ограничить объем (самое большее) глобальным файлом (путем объявления его статичный) переменная и метод get/методы установщика, которые защищают его от множественного доступа, где это могло быть опасно.

0
ответ дан Adam Hawes 26 November 2019 в 19:26
поделиться

Я нахожусь в "никогда" лагерь здесь; при необходимости в глобальной переменной, по крайней мере, используйте шаблон "одиночка" . Тем путем Вы получаете выгоду ленивого инстанцирования, и Вы не загромождаете глобальное пространство имен.

0
ответ дан Nik Reiman 26 November 2019 в 19:26
поделиться

Когда Вы объявляете константы.

1
ответ дан user15039 26 November 2019 в 19:26
поделиться

Глобальные переменные должны использоваться, когда несколько функций должны получить доступ к данным или записать в объект. Например, если необходимо было передать данные или ссылку на несколько функций, таких как единственный файл журнала, пул соединения или руководство по аппаратным средствам, к которому нужно получить доступ через приложение. Это предотвращает очень длинные объявления функции и большие выделения дублированных данных.

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

1
ответ дан Steropes 26 November 2019 в 19:26
поделиться

Это - инструмент как любой другой, обычно злоупотреблял, но я не думаю, что они являются злыми.

, Например, у меня есть программа, которая действительно действует как база данных онлайн. Данные хранятся в памяти, но другие программы могут управлять им. Существуют внутренние стандартные программы, которые действуют во многом как хранимые процедуры и триггеры в базе данных.

Эта программа имеет сотни глобальных переменных, но если Вы думаете об этом, что такое база данных, но огромное количество глобальных переменных.

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

я признаю, что в этом случае глобальный Вар является объектами, которым использовали методы для изменения состояния объекта. Так разыскивая, кто изменил объект, в то время как отладка не является проблемой, так как я могу всегда устанавливать точку останова на стандартной программе, которая изменяет состояние объекта. Или еще более простой я просто включаю созданный во входе, который регистрирует изменения.

1
ответ дан Kevin Gale 26 November 2019 в 19:26
поделиться

Я происходил из "никогда" лагерь, пока я не начал работать в военной промышленности. Существуют некоторые промышленные стандарты, которые требуют, чтобы программное обеспечение использовало глобальные переменные вместо динамического (malloc в случае C) память. Я должен заново продумать свой подход к динамическому выделению памяти для некоторых проектов, что я продолжаю работать. Если можно защитить "глобальную" память с соответствующими семафорами, потоками, и т.д. тогда это может быть приемлемым подходом к управлению памятью.

4
ответ дан gthuffman 26 November 2019 в 19:26
поделиться

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

, Когда Ваш код может быть многопоточный : избегайте любой ценой. Абстрактные глобальные переменные в очереди заданий или некоторую другую ориентированную на многопотоковое исполнение структуру, или, если абсолютно необходимо обертывают их в блокировки, имея в виду, что это вероятные узкие места в программе.

9
ответ дан Dan Lenski 26 November 2019 в 19:26
поделиться

Глобальные переменные в C полезны для создания кода более читаемым, если переменная требуется несколькими методами (вместо того, чтобы передать переменную в каждый метод). Однако они опасны, потому что все местоположения имеют способность изменить ту переменную, делая потенциально трудным разыскать ошибки. Если необходимо использовать глобальную переменную, всегда гарантировать, что она только изменяется непосредственно одним методом, и имейте все другое использование вызывающих сторон тот метод. Это сделает намного легче отладить проблемы, касающиеся изменений в той переменной.

9
ответ дан Jeff Yates 26 November 2019 в 19:26
поделиться

Рассмотрите этот koan: "если объем является достаточно узким, все глобально".

все еще очень возможно в этом возрасте должно записать очень быструю утилиту, чтобы сделать одноразовое задание.

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

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

На самом деле, я мог полужирным шрифтом утверждать что, если программа не это маленькое, то глобальные переменные должны быть недопустимыми.

  • , Если переменная никогда не будет изменяться, то это - константа, не переменная.
  • , Если переменная требует универсального доступа, то две подпрограммы должны существовать для получения и установки его, и они должны синхронизироваться.
  • , Если программа начинает с малого, и могла бы быть больше позже, то кодировать, как будто программа является большой сегодня, и отменяют глобальные переменные. Не все программы вырастут! (Хотя, конечно, который принимает, программист готов выбросить код время от времени.)
11
ответ дан Paul Brinkley 26 November 2019 в 19:26
поделиться

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

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

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

Премия.

, Когда Вы делаете это, внезапно, это не действительно глобально больше. Это - теперь часть некоторого модуля связанных функций.

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

, А не говорят "никогда глобальные переменные использования", можно сказать, "возлагают обязанности глобальной переменной на некоторый модуль, где он имеет большую часть смысла".

18
ответ дан S.Lott 26 November 2019 в 19:26
поделиться

Необходимо рассмотреть, в каком контексте глобальная переменная будет использоваться также. В будущем будет Вы хотеть, чтобы этот код копировал.

, Например, если Вы используете сокет в системе для доступа к ресурсу. В будущем будет Вы хотеть получить доступ к больше чем одному из этих ресурсов, если ответ будет да, я избегал бы globals во-первых, таким образом, майор осуществляет рефакторинг, не будет требоваться.

2
ответ дан JProgrammer 26 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: