char buf[256];
sprintf(buf, "%d", 12345);
// usar "buf"...
Si queremos mantener el buffer en heap:
char* buf = malloc(256);
sprintf(buf, "%d", 12345);
// usar "buf"...
free(buf);
En C++ podríamos hacer uso de los operadores new[]/delete[]:
char* buf = new char[256];
sprintf(buf, "%d", 12345);
// usar "buf"...
delete[] buf;
Pero es aconsejable evitar la creación de arreglos con new[], y en su lugar hacer uso de std::vector:
std::vector<char> buf(256);
sprintf(&buf[0], "%d", 12345);
// usar "&buf[0]" en vez de "buf"...
El resultado: tenemos un buffer en el heap que se libera automáticamente (~std::vector) al salir del ámbito de la función que lo utiliza.