2015-08-11 5 views
2

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

Итак, где хранятся статические переменные. Я думаю, что он хранится в текстовом сегменте. Таким образом, только при каждой итерации функции значение в статической переменной остается таким же. Если он находится в сегменте данных, происходит столкновение. Если он находится в стеке, область действия переменной увеличивается до времени жизни функции, поэтому она не может сохранить значение, хранящееся в переменной. Это правильно?

+0

текстовый сегмент хранит программный код, переменные не могут быть сохранены в текстовом сегменте, потому что они не являются программным кодом. (Cap.obvious) – mangusta

+3

* Статические переменные * или * ? И так, чтобы вы знали, это зависит от реализации (компилятор), а спецификация C ничего не говорит об этом (или такие вещи, как «сегменты»). –

+2

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

ответ

1

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

+0

Если переменные хранятся в сегменте данных, доступ к переменным осуществляется из любой точки программы, например глобальной. Нет или нет? Затем, как статические переменные помещаются в сегмент данных, а также область действия с функцией. Является ли это возможным? – mrg

+1

@mohan Почему вы заботитесь о сегментах? Это звучит как ваши умственные модели того, как все это работает. Вы думаете об этом на неправильном уровне. Забудьте о сегментах, по крайней мере, пока. В конце концов, стандарт не ссылается на них. Сосредоточьтесь на понимании языка, а не на конкретной реализации. –

+0

@DavidHeffernan Это не так. Просто я хочу знать, как статические переменные хранятся внутри, как и другие переменные. Для Ex: Если я хочу сделать сеанс об этом, я должен знать об a-z статической переменной. Там я не могу сказать этот тип ответа. И мы не говорим, что нет ссылки на стандартную реализацию. То, как мы ищем ответ, неверно. Но где-то ответ будет доступен. Мы хотим найти, пока не получим ответ. В любом случае, спасибо за помощь ... – mrg

0

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

0

Место хранения переменной зависит от времени жизни переменной. Время жизни статической переменной - время жизни всей программы. Поэтому статические переменные вместе с глобальными переменными хранятся в памяти data segment.

0

Статические переменные хранятся в сегменте данных кода. На самом деле, память делится на 3 основные части:

  • Текст, данные и стек/Heap

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

Стек и куча содержат динамические данные, то есть переменные, объявленные для области (локальные переменные) в стеке), глобальные/внешние/нераспределенные типы в куче (память, выделенная через malloc, calloc и т.д.) и вызов каждого функция создает новый стек.
это одна из причин, почему многие рекурсивные коды вызывают ошибки сегментации из-за переполнение стека

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

Смежные вопросы