void function() {
struct type_a outvar = HELPER_MACRO(info, INFO_SIZE);
Переменная outvar
выделяется при вызове функции (большинство [всех современных] реализаций используют стек) и уничтожается при выходе из функции.Переменная инициализируется каждый раз, когда вызывается функция.
void function() {
static struct type_a outvar = HELPER_MACRO(info, INFO_SIZE);
Переменная outvar
размещается в глобальном (статическом) хранилище с локальной областью действия и не уничтожается при выходе из функции,Переменная инициализируется до вызова main.Инициализатор должен быть константным выражением.
void function() {
struct type_a * outvar = malloc(...);
Переменная outvar
размещается в стеке и инициализируется по адресу выделенного блока в куче.Переменная уничтожается при выходе из функции, но выделенная память не освобождается автоматически.Он должен быть освобожден программистом.