Ty najskôr alokuješ pamäť pre premenné [a] a a potom v tej funkcii vycistit použiješ buffer na zásobníku a ten vrátiš (a pri ďalšom volaní ho trochu zo šťastím prepisuješ).
Alloc z main vyhoď, použi ho v tej funkcii (teda niečo ako z =malloc(strlen(str) + 1); ).
PS: Reťazec sa zvykne predávať ako char *str a nie ako char str[].
Hej, dynamicke premenne sa vytvaraju v heape, lokalne premenne podprogamov v zasobniku(stacku) a neexistuju mimo tohto podprogamu(respektive pouziju sa pri volani inych podprogramov). Preto ked funkcia vracia adresu(pointer), nikdy nevracaj adresu lokalnej premennej.