2014-12-08 1 views
2

у меня есть этот бит кода:Как инициализировать значения поплавка по умолчанию в массиве структур?

typedef struct { 
    kiss_fft_scalar r; 
    kiss_fft_scalar i; 
}kiss_fft_cpx; 

kiss_fft_cpx* spectrum; 
spectrum = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)* 2024); 

как inialize как r и i членов 0? без зацикливания всего массива? и держите его перекрестной платформой.

+1

используя calloc вместо malloc – CpS

+1

использовать calloc вместо malloc? В зависимости от типа kiss_fft_scalar calloc byte 0 будет отображать значение kiss_fft_scalar 0 (с нормальным поплавком и двойным, что в порядке). –

+1

'calloc' или заполнить память нулями: ' memset (спектр, 0, sizeof (kiss_fft_cpx)); ' –

ответ

3

Портабельно:

for (size_t i = 0; i < 2024; ++i) 
    spectrum[i].i = spectrum[i].r = 0; 

Другие предложили использовать calloc или memset; они будут работать, только если вы знаете, что вы только кодируете платформу, которая использует представление с плавающей запятой, в котором все бит-ноль означает 0.f, например IEEE754. (Я предполагаю, что kiss_fft_scalar - это float, как предлагает ваше название).

Если размер известен во время компиляции, то вы можете написать:

kiss_fft_cpx spectrum[2024] = { 0 }; 

, который будет инициализировать все значения 0.

NB. Don't cast malloc, и даже если размер неизвестен точно во время компиляции, но известен как маленький, у вас есть возможность избежать malloc/free, написав kiss_fft_cpx spectrum[size];.

+0

++ для замечания о возвращаемом типе 'malloc()' и предположении VLA. –

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