2

このコードを実行すると、「セグメンテーション エラー (コア ダンプ)」というエラーが表示されます。しかし、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);



}
4

1 に答える 1

4

NULLまたは0に初期化する必要があります。char *Aそうしないと(偶然にNULLまたは0でない場合)、GMPはランダムなメモリアドレスに書き込もうとし、セグメンテーション違反が発生します。

GMPドキュメントから:http://gmplib.org/manual/Converting-Integers.html

strがNULLの場合、結果の文字列は現在の割り当て関数を使用して割り当てられます(カスタム割り当てを参照)。ブロックはstrlen(str)+1バイトになります。これは、文字列とnullターミネータには正確に十分です。

strがNULLでない場合は、結果に十分な大きさのストレージのブロックを指している必要があります。これはmpz_sizeinbase(op、base)+ 2です。余分な2バイトは、マイナス記号の可能性とnullターミネータ用です。

于 2012-10-31T03:11:35.497 に答える