Невозможно сделать это, используя только средства, предусмотренные стандартом C. Самое близкое, что вы можете прийти, это
FILE *scratch = tmpfile();
...
store_data(scratch);
...
/* after you're completely done calling the legacy code */
rewind(scratch);
buf = read_into_memory_buffer(scratch);
fclose(scratch);
Это действительно ударит по диску, по крайней мере, потенциально, но я бы сказал, что это ваш лучший выбор, если вам нужна широкая переносимость и вы не можете изменить «старый код».
В POSIX.1-2008 есть open_memstream
, который делает именно то, что вы хотите; тем не менее, этот пересмотр POSIX еще не получил широкого распространения. В GNU libc (используется в Linux и некоторых других) он есть, но, насколько я знаю, он недоступен в OSX или * BSD и, конечно, не в Windows.