Существует альтернатива, в которой вы предоставляете буфер:
char *esploratoreToString(esploratore *e, char *buf, int bufsz) {
snprintf(buf, bufsz,
"%s %s %d %d",
e.nome, e.cognome, e.nascita, e.morte);
return buf;
}
...
int main()
{
char buf[100];
esploratore exp = {...};
printf("%s\n", esploratoreToString(&exp, buf, sizeof buf);
}
Таким образом, вы можете выделить его динамически или как автоматически выделенный буфер стека c.
Другой альтернативой является чтобы вернуть указатель на статически выделенный буфер, как в:
char *esploratoreToString(esploratore *e) {
static char buf[50];
snprintf(buf, bufsz,
"%s %s %d %d",
e.nome, e.cognome, e.nascita, e.morte);
return buf;
}
Но проблема в том, что он не реентерабелен, а также если вам нужно вызвать его дважды при одном и том же вызове printf(3)
(в main
) второй вызов перезапишет буфер, и вы получите странное поведение из-за того, что перезаписываете один результат другим и печатаете дважды одно и то же.