Хорошо, ваше основное требование - запрашивать ресурс и кэшировать возвращаемые данные в памяти, чтобы избежать множественного доступа.
Это означает, что вам придется выделить память в вашей программе для хранения всех данных..
Проблема № 1 заключается в заполнении этого кэша.Я предполагаю, что вы это выяснили, и есть какая-то функция get_resource ();
проблема № 2 состоит в том, как создать API, чтобы позволить клиентскому / пользовательскому коду взаимодействовать с этими данными.
В вашем примере вы используете массив, выделенный клиентом, в качестве кэша, надеясь решить обе проблемы с 1 буфером, но это не решает проблему во всех случаях (следовательно, ваше размещение).Таким образом, вам действительно нужно разделить 2 задачи.
Модель № 1 должна обеспечивать функциональность итератора / курсора
iterator = get_something(); // Triggers caching of data from Resource
data = get_next_single_something( iterator );
status = release_something( iterator );
// The logic to release the data could be done automagically in get_next,
// after returning the last single_something, if that is always the use case.
Модель # 2 - возвращать весь объект в буфере с ошибками,и пусть клиент управляет всем этим
data_type *pData=NULL;
unsigned size = get_something( &pData ); // Triggers caching of data from Resource
process( size, pData );
free( pData );
pData=NULL;
Модель # 3.Если вы состоите в браке с клиентским массивом, вы можете использовать Модель # 1 для одновременного возврата нескольких значений, , но , если есть другие значения, тогда get_something () придется построитькэша, и клиент все равно должен будет выполнить итерацию.