仅使用GNU MP Bignum Library几次,我有兴趣看到我以前分配/启动数组的方式现在已经过时了。来自Integer Special Functions:
5.16特殊功能
本节中的功能用于各种特殊目的。最 应用程序将不需要它们。 - 功能:void mpz_array_init (mpz_t integer_array,mp_size_t array_size,mp_size_t fixed_num_bits)
This is an obsolete function. Do not use it.
这是我分配和初始化mpz_t
数组的方法。
int array_size = 100;
mpz_t *num_arr;
num_arr = malloc(arr_size * sizeof(mpz_t));
mpz_array_init(*num_arr, array_size, 1024);
这仍然有效,没有错误或警告,顺便说一下,但是现在这个函数被列为过时的,在C中使用GMP分配数组的正确方法是什么?
答案 0 :(得分:8)
如果要预先分配内存,只需循环遍历数组元素并使用mpz_init2
逐个初始化它们:
for (i = 0; i < array_size; i++) {
mpz_init2(num_arr[i], 1024);
}
mpz_array_init
的问题在于它永远不会释放分配的内存。如果您单独初始化元素,则可以在以后释放它们:
for (i = 0; i < array_size; i++) {
mpz_clear(num_arr[i]);
}
答案 1 :(得分:-1)
不同方法怎么样:
/*
http://scicomp.stackexchange.com/questions/3581/large-array-in-gmp
gcc a.c -lgmp
*/
#include <stdlib.h> // malloc
#include <stdio.h>
#include <gmp.h>
#define LENGTH 100000
int main ()
{
/* definition */
mpz_t *A;
mpz_t temp;
mpz_init(temp);
/* initialization of A */
A = malloc(LENGTH * sizeof(mpz_t));
if (A==NULL) {
printf("ERROR: Out of memory\n");
return 1;
}
// assign
mpz_set_ui(temp, 121277777777777777); // using temp var
mpz_set(A[4], temp);
mpz_set_str(A[5], "19999999999999999999999999999999999999999999999999992",10); // using string if number > max
// check
gmp_printf ("%Zd\n",A[4]); //
gmp_printf ("%Zd\n",A[5]); //
/* no longer need A */
free(A);
mpz_clear(temp);
return 0;
}
好吗?