Как правильно инициализировать очень большую структуру?

В нашем коде у нас было что-то вроде этого:

   *(controller->bigstruct) = ( struct bigstruct ){ 0 };

Раньше это прекрасно работало, а затем мы обновили версии GCC и неожиданно начали видеть переполнение стека. Глядя на сборку, старый код GCC (2.x) в основном делал это:

memset(controller->bigstruct, 0, sizeof(struct bigstruct));

Новый GCC (3.4.x) делал это

   struct bigstruct temp = { 0 };
   controller->bigstruct = temp;

Изучив спецификацию C99, я понял, почему; C99 в основном требует наличия анонимных структур в стеке. Это'Хорошая концепция, но эта структура была размером в 4 мегабайта и предназначена только для кучи!

Мы'мы стали делать свои собственныеинициализировать» функция, которая явно устанавливает членов, но этоуродливая и головная боль обслуживания. Я нене считаю memset правильным решением, потому что я не могуне знаю, что значение бита, равное 0, является подходящим нулевым значением для типа (выбор нит, я знаю, но вот вы; я нене возражаю, что компилятор делает это, потому что этоМожно знать)

Что "правильный"или, по крайней мере, лучший способ инициализации такой большой структуры?

Чтобы уточнить, почему я думаю, что memset неРешение: правила инициализации элементов, которые не были явно инициализированы, такие же, как статическая инициализация, и заключаются в следующем: - если он имеет тип указателя, он инициализируется нулевым указателем; - если он имеет арифметический тип, он инициализируется нулем (положительным или без знака); ...»

MemSet» установит память в ноль бит-шаблона, который неТ обязательно то же самое. Представьте себе систему, которая неt использовать числа с плавающей точкой IEEE. Необычно, но поддерживается C. Представление 0.0 недолжен иметь в виду "все биты ноль "Это может быть что угодно для процессора.

Ответы на вопрос(5)

Ваш ответ на вопрос