Я использовал open_memstream для достижения этой цели в прошлом.
Эта функция открывает поток для записи в буфер. Буфер распределяется динамически и при необходимости увеличивается с помощью malloc. После того, как вы закрыли поток, вы должны очистить этот буфер, используя free или realloc.
https://www.gnu.org/software/libc/manual/html_node/String-Streams.html
#include <stdio.h>
int
main (void)
{
char *bp;
size_t size;
FILE *stream;
stream = open_memstream (&bp, &size);
fprintf (stream, "hello");
fflush (stream);
printf ("buf = `%s', size = %zu\n", bp, size);
fprintf (stream, ", world");
fclose (stream);
printf ("buf = `%s', size = %zu\n", bp, size);
return 0;
}