Innymi słowy jak poprawnie podać zainicjalizowaną zmienną strukturalną jako argument funkcji?
Tak jak w każdym przypadku gdy chcesz przekazać dane a nie kopię danych. Czyli jako referencję, referencję stałą, wskaźnik (ew. stały lub na stałe dane).
Czyli:
1. Referencję (czyli nie kopię co robisz w swoim kodzie).
void ustaw_cechy_rasowe(bohater& b);
2. Referencję stałą:
void wyswietl_cechy_rasowe(const bohater& b);
3. Wskaźnik na dane zmieniane:
void ustaw_cechy_rasowe(bohater * b);
4. Wskaźnik na stałą:
void wyswietl_cechy_rasowe(const bohater * b);
5. Stały wskaźnik na stałą:
void wyswietl_cechy_rasowe(const bohater * const b);
Jak widzisz (z nazw funkcji które podałem), wskaźniki na stałą oraz stałe referencje, nie umożliwiają modyfikacji. Więc co do literalnego potraktowania Twojego pytania, interesują Cię sposoby (1) i (3). Dobra praktyka jednak preferuje sposób (1).
Z kodu który podałeś to nie wynika. Podejrzewam jednak że alokujesz strukturę bohater dynamicznie (new). W takim przypadku niezbędne jest jej zwolnienie przez delete. To może być jeden z powodów wycieku pamięci.
W języku C++ (takie ma tagi Twoje pytanie), nie podaje się słowa kluczowego struct w argumentach funkcji. Struktura tworzy byt tożsamy z klasą czyli typem. To C wymaga podawania słowa kluczowego struct w argumentach funkcji.
Przeczytaj także co robi konstruktor domyślny który u Ciebie występuje w strukturze bohater.