GMP GNU代码出错?

时间:2012-10-31 02:51:58

标签: c gmp

当我运行此代码时,出现“Segmentation fault(core dumped)”错误。但没有使用 mpz_get_str,它很好。

#include<stdio.h>
#include<gmp.h>
int main()
{
char *A;
mpz_t P,Q;
mpz_init(P);
mpz_init(Q);
mpz_set_str(P,"1201858877187548528922917",10);
mpz_set_str(Q,"1248833599132922783100713",10);

mpz_t PHI,E,K,d;
mpz_init(PHI);
mpz_init(E);
mpz_init(K);
mpz_init(d);

mpz_sub_ui(PHI,P,1);
mpz_sub_ui(K,Q,1);
mpz_mul(PHI,PHI,K);
mpz_set_str(E,"37",10);
mpz_gcd(d,E,PHI);
gmp_printf("d=%Zd\n",d);
mpz_invert(d,E,PHI);
gmp_printf("d=%Zd\n",d);
A=mpz_get_str(A,2,d);

mpz_mul(K,d,E);
mpz_sub_ui(K,K,1);
mpz_divexact(K,K,PHI);



}

1 个答案:

答案 0 :(得分:3)

您应该将char *A初始化为NULL或0,否则(如果它不是NULL或偶然为0),GMP将尝试写入随机存储器地址,这将导致段错误。

来自GMP文档:http://gmplib.org/manual/Converting-Integers.html

  

如果str为NULL,则使用当前分配函数分配结果字符串(请参阅自定义分配)。该块将是strlen(str)+1个字节,对于字符串和空终止符来说就足够了。

     

如果str不是NULL,它应该指向一个足够大的存储块用于结果,即mpz_sizeinbase(op,base)+ 2.两个额外的字节用于可能的减号,并且null终止符