2010-03-25 2 views
2

Получил противоречивые мнения о хранилище статических переменных.Где хранятся статические переменные (сегмент данных или куча или BSS)?

Мнение 1: «А стека статические переменная хранит его значение в кучи»

Мнение 2: «А стека статические переменная хранит его значение в данных сегмента» ,

Я смущен этими противоречивыми ответами.

Где хранятся статические переменные?

Я ожидаю ответы со ссылками (учебники, подлинные учебники и т. Д.).

Статические переменные имеют два типа:

  1. статические переменные, объявленные внутри функции.
  2. глобальная (объявленная внешняя функция) статическая переменная.

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

+0

Это возможно дубликат http://stackoverflow.com/questions/93039/where-are-static-variables-stored-in-cc, но это трудно сказать, потому что ОП, кажется, mix "static" и "stack". –

ответ

0

Память стека выделяется при запуске приложения и всегда остается того же размера во время выполнения приложения. Он не сохраняется в сегменте DATA, сегмент DATA предназначен для таких вещей, как постоянные значения, используемые в приложении (например, строковые литералы).

10

«Переменные стека» обычно хранятся в «стеке», который отделен от разделов текста, данных, bss и кучи вашей программы.

Вторая половина вашего вопроса посвящена переменным «статические», которые отличаются от переменных стека - действительно, статические переменные вообще не живут в стеке. Классически статические переменные были бы в разделе данных или bss вашей программы. С современными компиляторами, если данные имеют const-квалификацию, данные могут храниться в текстовом разделе вашей программы, который имеет множество преимуществ (включая принудительную немодификацию).

В стандарте C не указывается, что существует стек или раздел bss. Это просто требует, чтобы пространство для хранения было доступно для переменных с соответствующей продолжительностью.

0

Оба локальных и глобальные статическая переменные хранятся в инициализированных сегментах данных

Есть два сегмента данных инициализирован сегмент данных и инициализирован сегмент данных.

Сегментированный сегмент данных, также называемый BSS.

Когда мы говорим сегмент данных, по умолчанию это инициализированный сегмент данных, этот раздел копируется из загруженного изображения программы. (все глобальные переменные и локальные статические переменные, инициализированные до нуля, т. е. ini var1_global = 10;)

Неинициализированные данные segemnet aka BSS. Этот раздел будет инициализирован нулевым генералом, как раз перед вызовом main(). Здесь приводится весь объединенный глобальный, локальный статический.

http://www.geeksforgeeks.org/memory-layout-of-c-program/

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