やめた方がいい設計だと思うが、やるとしたらこんな感じだろうか・・・

void Swap_wave(Wave *a, Wave *b) {
Wave tmp = *a;
*a = *b;
*b = tmp;
}
void func(Wave *wavep){
Wave *wavepbuff = Alloc_wave();
〜〜
Swap_wave(wavepbuff, wavep);
Free_wave(wavepbuff);
}
int main() {
Wave *wavep = Alloc_wave();
〜〜
func(wavep);
〜〜
Free_wave(wavep);
}