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