struct中灵活的mpz_t数组
我有这样的结构:
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; 好的,所以它是一个普通的灵活数组,我应该可以使用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; } 但是当我尝试使用它时,我遇到了分段错误.我也受到了投诉 我也尝试使用我的结构: 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; 我还将initArray函数更改为: void initArray(CoolArray* array,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,numbits); return; } 这个不是段错误,但我在编译时得到投诉 这是我在输出中得到的那种错误: gmpascal(80964) malloc: *** error for object 0x100801088: Non-aligned pointer being freed *** set a breakpoint in malloc_error_break to debug 附: gmpascal是我的可执行文件的名称,它计算第n行 P.P.S.我正在使用这些标志在Powermac上使用gcc-4.2进行编译: -arch ppc64 -o gmpascal gmpascal.c -lgmp -Wall 这里有什么我想念的吗? 解决方法
请记住,我不编写gmp,但结构中的尾部动态缓冲区通常是这样实现的(适应我认为你想要使用它):
typedef struct { size_t length; //length of the array size_t numbits; //number of bits allocated per val in vals mpz_t vals[1]; //flexible array to hold some number of mpz_t array } CoolArray; 分配策略,知道值的数量和位深度,将是: 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; } 释放它(只是free()的包装器,但你可能需要做一些我不熟悉的gmp-cleanup): void freeArray(CoolArray **pp) { if (*pp) { free(*pp); *pp = NULL; } } 使用它: CoolArray *pca = allocArray(length,numbits); 完成后释放它: freeArray(&pca); 这些只是想法,但也许你可以从中得到一些东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |