Как можно проинициализировать нулями структуру в си
Есть у меня вот такая структура:
typedef struct {
char str[4][256];
int sizeStr;
} _StrCalc;
_StrCalc StrCalc;
Структура глобальная нужно проинициализировать ее нулями. Как это можно сделать кроме 'memset()'?
Ответы (1 шт):
Автор решения: maestro
→ Ссылка
Если вы компилируете в IAR, то всё инициализируется автоматически. Если в Keil или других системах, основанных на GCC, то ищите файл startup_stm32f*.asm. В нём содержится код, который как раз выполняет инициализацию статической памяти. Вот пример:
Reset_Handler:
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
ldr r2, =_sbss
b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2], #4
LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss
В коде присутствуют константы _sbss, _sidata, _edata и т.д. Они заданы в скрипте линкера (файл с расширением LD).
Вам нужно:
- проверить наличие указанного кода;
- проверить правильность констант в скрипте линкера.