Ошибка в коде GMP GNU?
Когда я запускаю этот код, у меня появляется ошибка "Ошибка сегментации (ядро сброшено)". Но без использования 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 ответ
Вы должны инициализировать ваш char *A
в NULL или 0, в противном случае (если это не NULL или 0 случайно), GMP попытается записать в случайный адрес памяти, что приведет к segfault.
Из документации GMP: http://gmplib.org/manual/Converting-Integers.html
Если str равно NULL, результирующая строка выделяется с использованием текущей функции выделения (см. Пользовательское распределение). Блок будет strlen(str)+1 байт, этого вполне достаточно для строки и нулевого терминатора.
Если str не равен NULL, он должен указывать на достаточно большой для результата блок памяти, то есть mpz_sizeinbase (op, base) + 2. Два дополнительных байта предназначены для возможного знака минус и нулевого терминатора.