2012-10-31 2 views
1

이 코드를 실행하면 "분할 오류 (코어 덤프)"오류가 발생합니다. 그러나 mpz_get_str을 사용하지 않으면 okey입니다.GMP GNU 코드에 오류가 있습니까?

#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); 



} 
+0

Valgrind로 프로그램을 실행하면 오류의 위치를 ​​알려줍니다. Valgrind는 예상치 못한 세그먼테이션 오류를 처리 할 때 사용할 수있는 가장 좋은 도구입니다. –

답변

3

당신은 GMP는 segfault의 원인이됩니다 임의의 메모리 주소로 작성하려고합니다, (가 우연히 NULL 또는 0이 아니라면) 당신의 char *A, 그렇지 않으면 NULL 또는 0으로 초기화한다. GMP의 문서에서

:

STR이 NULL 인 경우 http://gmplib.org/manual/Converting-Integers.html는 결과 문자열은 현재의 할당 기능을 사용하여 할당 (사용자 정의 할당 참조). 블록은 strlen (str) +1 바이트가되며, 문자열과 널 종료 자로 충분합니다.

str이 NULL이 아닌 경우 mpz_sizeinbase (op, base) + 2 인 결과를 저장할 수있는 충분한 크기의 블록을 가리켜 야합니다. 두 개의 추가 바이트는 가능한 빼기 기호이고, 터미네이터.

+0

도움을 많이 주셔서 감사합니다. – user12290