Относительно вашего заглавного вопроса: Можно ли динамически инициализировать статическую переменную в 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()
начинает работать.)