C 结构中灵活的mpz_t数组

C 结构中灵活的mpz_t数组,c,struct,malloc,gmp,calloc,C,Struct,Malloc,Gmp,Calloc,我有一个这样的结构: typedef struct{ size_t length; // length of the array size_t numbits; // number of bits allocated per val in vals mpz_t vals[]; // flexible array to hold some number of mpz_t array } CoolArray; typedef struct{ size_t lengt

我有一个这样的结构:

typedef struct{
    size_t length; // length of the array
    size_t numbits; // number of bits allocated per val in vals
    mpz_t vals[]; // flexible array to hold some number of mpz_t array
} CoolArray;
typedef struct{
    size_t length; // length of the array
    size_t numbits; // number of bits allocated per val in vals
    mpz_t* vals; // pointer to start of array
} CoolArray;
好的,这是一个普通的灵活数组,我应该能够使用malloc来设置 它的大小:

void initArray(CoolArray* array, size_t length, size_t numbits){
    assert(length>=1); // don't make arrays with a length<=0

    // first I allocate memory for vals...
    array->vals = (mpz_t*) malloc(sizeof(CoolArray)+length*sizeof(mpz_t));

    // then I allocate memory for each val in vals
    mpz_array_init(array->vals, (size_t)length, numbits);

    return;
}
我还将我的
initArray
函数更改为:

void initArray(CoolArray* array, size_t length, size_t numbits) {
    assert(length>=1); // don't make arrays with a length<=0

    // first I allocate memory for vals...
    array->vals = (mpz_t*) calloc(length, sizeof(mpz_t));

    // then I allocate memory for each val in vals
    mpz_array_init(array->vals, (size_t)length, numbits);

    return;
}
p.S.
gmpascal
是我的可执行文件的名称,它计算 帕斯卡三角形

p.p.S.我正在使用
gcc-4.2
Powermac上编译,并使用以下标志:

-arch ppc64 -o gmpascal gmpascal.c -lgmp -Wall

这里有我遗漏的东西吗?

请记住,我没有编写gmp,但是结构中的尾部动态缓冲区通常是这样实现的(根据我认为您想要使用它的方式进行调整):

知道值的数量和位深度的分配策略是:

CoolArray* allocArray(size_t length, size_t numbits)
{
   CoolArray *p = malloc(sizeof(*p) + sizeof(mpz_t)*length);
   p->length = length;
   p->numbits = numbits;
   mpz_array_init(p->vals, length, numbits);
   return p;
}
释放它(只是一个免费的包装(),但您可能需要做一些我不熟悉的gmp清理):

使用它:

CoolArray *pca = allocArray(length, numbits);
完成后释放它:

freeArray(&pca);

这些只是想法,但也许你可以从中得到一些东西。

如果你使用灵活的数组成员,你需要一次性分配结构:

CoolArray *array = malloc(sizeof(CoolArray) + length * sizeof(mpz_t));
mpz_array_init(array->vals, length, numbits);

我对此不确定,所以我把它作为一个评论。mpz_不是动态分配的吗?如图所示,它将根据需要而变大。因此,创建一个mpz_t数组是行不通的,因为它们总是根据输入改变大小。@Enders:
mpz_array_init
将动态地为数字分配大小,但之后将不允许它们增长。请参阅。注意:
memset
mpz\u array\u init
@DietrichEpp是冗余的,对此并不奇怪。正如我所说,不熟悉gmp,但已经在结构上做了大量基于尾部的动态缓冲。感谢您提供的信息,我会记得,如果我真的为某件事选择了gmp,它实际上并不特定于gmp——它是初始化现有内存的
something\u init
函数的一种相对常见的命名约定,与
something\u destroy
成对使用;就像我在使用OpenSSL和BSAFE CryptoCME时,
something\u new
something\u free
@DietrichEpp配对一样,你可能会认为我已经学会了这一点。再次感谢。
CoolArray *pca = allocArray(length, numbits);
freeArray(&pca);
CoolArray *array = malloc(sizeof(CoolArray) + length * sizeof(mpz_t));
mpz_array_init(array->vals, length, numbits);