El problema que tiene esto es que string_append modifica el primer parámetro que recibe, pero los strings literales (como el "HOLA " que está por ahí) se guardan en el segmento de código del programa, por lo que son de sólo lectura.
Durante la primer jornada de charlas en Medrano, no recuerdo por qué motivo pero nos surgió una duda al respecto con los chicos, y lo pude probar con un programa como lo que hay acá.
Fijate cómo hay tres grupos de direcciones perfectamente bien distinguidos: hay un montón de direcciones de la pinta 0x10c4d1???, otras en 0x7fff5372e8??, y otra (la del heap) en 0x7fdc78c03a20.
Fijate, por ejemplo, que la variable local de la funcionUno da exactamente la misma dirección que la funcionDos. Es pura casualidad, sí. Pero no hay problema, porque para cuando yo llamé a la funcionDos, ya había terminado la ejecución de funcionUno. Y el parámetro, obviamente, está en direcciones cercanas. ¿Qué segmento será ese? Claro que sí, el stack.
Las funciones están en direcciones como 0x10c4d1