Можно ли динамически инициализировать статическую переменную в c? - PullRequest
0 голосов
/ 05 декабря 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

То, что вы называете static, равно длительности статического хранения. .

Объявление переменной с длительностью статического хранения практическиозначает, что во время компоновки компоновщик будет выделять хранилище для переменной.Когда компоновщик выделяет хранилище, это означает, что переменная будет иметь один адрес в разделе .rodata (для констант) или в разделе «.data», или .bss.

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

0 голосов
/ 05 декабря 2018

Относительно вашего заглавного вопроса: Можно ли динамически инициализировать статическую переменную в c? Ответ - нет.Подробности о причинах ниже ...

Ответ на ваш следующий вопрос:

"Итак, можно сказать, что невозможно инициализировать статическую переменную с помощью динамического выделения памяти ..."

- это да, мы можем сказать, что , потому что:

static int *array = calloc(5, sizeof(int)); 

не удастся скомпилировать, так как элемент инициализатора не является временем компиляциипостоянная.

Причина, по которой он не скомпилируется, указана в стандарте C, п. 5.1.2 , где четко указано:

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

Однако динамическое выделение памяти для правильно инициализированной static переменной является допустимым:

static int *array = NULL; //properly initialized static pointer variable.
...
array = calloc(5, sizeof(int));// legal

Ответы на ваш последний вопрос: почемузначение статической переменной должно быть известно до начала работы main?

может быть получено из Эти операторы ...

1) Статические переменные имеют свойство сохранять свое значение даже после того, как они выходят за пределы их области видимости!Следовательно, статические переменные сохраняют свои предыдущее значение в своих предыдущей области и больше не инициализируются в новой области. [выделено мной]

2) Статические переменные - это выделенная память в сегменте данных, а не в сегменте стека .Смотрите макет памяти программ на C для деталей. [выделено мной]

3) Статические переменные (например, глобальные переменные) инициализируются как 0, если не инициализированы явно.Например, в приведенной ниже программе значение x выводится как 0, а значение y - что-то вроде мусора. [см. Ссылку для ссылочной программы]

Итак, по определению,Поскольку переменные с статической областью хранения требуются для сохранения локальной переменной в течение срока службы программы, имеет смысл, что известное значение существует в этом пространстве памяти во времянаступление времени выполнения.(Когда main() начинает работать.)

...