>Если уж функция берет на себя труд вернуть структуру с массивом внутри,
>Обнуление в данном случае лишняя операцияНет. Обнуление не лишняя операция никогда. Обнуление буфера сразу после его выделения - признак хорошего стиля и средство, в некоторых случаях, спасающее от изрядного геморроя. Например, в программе может быть баг, в результате которого будет пропущен вызов функции, заполняющей буфер, а последующая обработка буфера будет проведена. В случае, если буфер не был обнулён, то произойдёт обработка мусора.
Всегда за начальной корректностью выделяемых буферов и указателей, переменных.. должна следить та процедура, которая их объявляет. Если выделяется буфер, он обнуляется. Если объявляется указатель, то он или NULL или действительное значение должен получить. Поверьте моему опыту - это очень часто избавляет от сильного геморроя. Обнуление это не запихивание структуры в стек - оно делается очень быстро.
>Естественно при создании "тяжелых" структур на возврате из функции возникнет вопрос оптимизации.
Лучшая оптимизация в данном случае - не делать через не то место.
>Автор поста спрашивал "как на С++", но при это запрашивает присущие С
>способы.
Ничего "присущего С" и не "присущего" С++ я в его вопросе не увидел, кроме printf
Автору следует определится с языком, т.к. для C++ есть контейнеры
>STL (в частности std::string).
STL это библиотека, а не часть языка. Если человек только начал разбираться с базовыми понятиями, то от STL у него мозги могут закипеть. Не следует ему ни с чем определяться на начальном этапе.