具有 GMP 的 SIGSEGV

SIGSEGV with GMP

我正在尝试生成一个数字 e,它是两个数字(p 和 q)的乘积。

但我什至无法 运行 代码...我遇到了分段错误,我确定那是什么 simple/importante 但我真的想不通:

void PubKeyED(mpz_t e,mpz_t d,mpz_t p,mpz_t q){
    unsigned long int cmp,cont,seed;
    mpz_t pq,gcdpq;
    cont=1;
    mpz_inits(pq,gcdpq);
    mpz_sub_ui(p,p,cont);
    mpz_sub_ui(q,q,cont);
    mpz_mul(pq,p,q);
    seed = time(NULL);
    gmp_randstate_t init;
    gmp_randinit_mt(init);
    gmp_randseed_ui(init, seed);
    do
    {
        mpz_urandomm(e, init, pq);
        mpz_gcd (gcdpq, e, pq);
        cmp=mpz_cmp_ui(gcdpq,cont);
        if (cmp==0)
        {
            cont=0;
        }
    } while (cont);
}

int main(){
    mpz_t e,d,p,q;
    mpz_inits(p,q,e,d);
    mpz_set_ui (p, 17);
    mpz_set_ui (q, 23);
    PubKeyED(e,d,p,q);

}

我是 gmp 的新手,对 C 不太熟悉。

如果你 read the documentation mpz_inits 你会看到它

Initialize a NULL-terminated list of mpz_t variables

[强调我的]

您的代码存在的问题是您传递的参数列表不是“NULL 终止的”。

您需要像这样更换电话:

mpz_inits(p,q,e,d,NULL);  // End argument list with a null pointer

mpz_inits 的参数需要 NULL 终止:

mpz_inits(pq,gcdpq,NULL);
mpz_inits(p,q,e,d,NULL);