Как инициализировать массив структур в C? - PullRequest
4 голосов
/ 04 апреля 2011

Сценарий состоит в том, что у меня есть определение вложенной структуры, и у меня есть массив из 10 таких структур.Что я хочу, это инициализировать каждый элемент родительской и дочерней структуры с нуля.Код приведен ниже:

struct PressureValues
{

   float SetPressure;
   float ReadPressure;

};

struct CalibrationPoints
{

   float SetTemperature;
   struct PressureValues PressurePoints[10];

};

extern volatile struct  CalibrationPoints code IntakeCalibrationPoints[10];

extern volatile struct  CalibrationPoints code DischargeCalibrationPoints[10];

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

Ответы [ 4 ]

11 голосов
/ 04 апреля 2011
volatile struct CalibrationPoints IntakeCalibrationPoints[10] = { { 0 } };
volatile struct CalibrationPoints DischargeCalibrationPoints[10] = { { 0 } };

При этом все элементы будут обнулены.

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

2 голосов
/ 04 апреля 2011

Во-первых, я думаю, что вы неправильно поняли, что означает "инициализация".

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

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

Что касается вашего вопроса, вы можете использовать memset(), чтобы быстро заполнить нулями память. Ура! Надеюсь, я помог.

memset(): http://www.cplusplus.com/reference/clibrary/cstring/memset/

1 голос
/ 04 апреля 2011

вы можете попробовать:

struct CalibrationPoints struct;
memset ( struct, 0, sizeof(CalibrationPoints));
` 
1 голос
/ 04 апреля 2011

Вы можете использовать

memset(IntakeCalibrationPoints, 0x00, sizeof( IntakeCalibrationPoints))

, например,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...