Haga que un puntero de archivo lea / escriba en una ubicación en memoria

Puedo hacer que un puntero de archivo escriba en un archivo con fopen (). Pero, ¿puedo hacer un puntero de archivo que lo haga para que las funciones de llamada como fputc o fprintf escriban en un puntero en la memoria? Un ejemplo de esto es ByteArrayOutputStream en java. Además: ¿podría ejecutarlo al revés, donde una biblioteca necesita un puntero de archivo para leer, así que asigno memoria y hago un nuevo puntero de archivo que leerá desde esta ubicación de memoria pero devolverá EOF cuando se agote el tamaño del fragmento? (como ByteArrayInputStream en Java). ¿Hay alguna manera de hacer esto en C? Por ejemplo

FILE *p = new_memory_file_pointer();
fprintf(p, "Hello World!\n");
char *data = get_written_stuff(p);
printf("%s", data); //will print Hello World!

&& / ||

char s[] = "Hello World!\n";
FILE *p = new_memory_file_pointer_read(s, sizeof(s));
char *buffer = (char *)malloc( 1024*sizeof(char) );
fread((void *)buffer, 1, sizeof(s), p);
printf("%s", buffer); //prints Hello World!

EDITAR Para aquellos que lean esta pregunta años después, además de la respuesta aceptada, deben miraropen_memstream(3), que se comporta más como estas clases de Java quefmemopen hace

Respuestas a la pregunta(4)

Su respuesta a la pregunta