O código (partes irrelevantes removidas)
void mpz_choose_ui(mpz_t rop,ul a,ul b){
mpz_clear(rop);
mpz_init(rop);
}
causa um segfault mesmo que o mpz_t rop seja limpo antes do init, o gdb mostra
0x00007ffff7da2c95 in __GI___libc_free (mem=0xffffffffffffffff) at malloc.c:3453
3453 if (chunk_is_mmapped (p)) /* release mmapped memory. */
Parece que algo foi mapeado mesmo que mpz_clear tenha sido executado antes.
o exemplo mínimo reproduzível é
void mpz_example(mpz_t rop){
mpz_clear(rop);
mpz_init(rop);
}
void example(){
mpq_t tmp;
mpz_t tmp2;
mpz_t tmp3;
mpz_example(tmp3);
}
int main(void)
{
mpq_t rop;
mpq_init(rop);
example();
return 0;
}
isso cheira a uso depois de free ou algo assim, mas tudo é limpo e então inicializado
sim, elas precisam ser 3 funções separadas por algum motivo
tmp e tmp2 também precisam estar lá por algum motivo