После выполнения этого кода:
output * pOutput = NULL;
ns1_func1(&inp1, pOutput);
pOutput будет всегда иметь значение NULL, независимо от того, что делает ns1_func. Вы передаете значение pOutput функции, которая в этом случае равна NULL. Функция не может изменить это значение, не зная адрес pOutput (записывается как & pOutput).
ns1_func1 запрашивает указатель на структуру «output», потому что именно там он хочет записать выходные данные. Это означает, что вам нужно выделить это пространство либо в стеке:
output theOutput;
output * pOutput = &theOutput;
ns1_func1(&inp1, pOutput);
или в кучу:
output * pOutput = malloc(sizeof(output));
ns1_func1(&inp1, pOutput);
...
free(pOutput);
Если бы ns1_func1 собирался выделить память для вас, он должен был бы вернуть указатель на выходную структуру. Для этого необходимо запросить адрес этого указателя или указатель на указатель. Другими словами, объявление типа:
output * pOutput = NULL;
different_ns1_func1(&inp1, &pOutput);
if (pOutput != NULL) {
...
free(pOutput);
}
Извините, если это немного сбивает с толку, со всеми разговорами об указателях на указатели, но основной ответ на ваш вопрос заключается в том, что вы должны выделить память для функции для записи, потому что функция запрашивая адрес данных , а НЕ адрес указателя на данные .