Как можно проинициализировать нулями структуру в си

Есть у меня вот такая структура:

    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).

Вам нужно:

  1. проверить наличие указанного кода;
  2. проверить правильность констант в скрипте линкера.
→ Ссылка