Bro*_*eph 5 c malloc struct 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;
Run Code Online (Sandbox Code Playgroud)
好的,所以它是一个普通的灵活数组,我应该可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用它时,我遇到了分段错误.我也抱怨有关错误使用mpz_array_init的问题.但是我看过manula,看来我正在这样做.
我也尝试使用我的结构:
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;
Run Code Online (Sandbox Code Playgroud)
我也改变了我的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;
}
Run Code Online (Sandbox Code Playgroud)
这个不是段错误,但我在编译时得到关于错误使用的抱怨mpz_array_init,并且我的输出中也出现了一堆malloc错误,以及我想看到的输出.谁能告诉我我的代码不正确?为什么第一个版本是segfault?我按照人们似乎推荐的方式做到了.为什么编译器抱怨
mpz_array_init使用不正确?
这是我在输出中得到的那种错误:
gmpascal(80964) malloc: *** error for object 0x100801088: Non-aligned
pointer being freed *** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
PS gmpascal是我的可执行文件的名称,它计算帕斯卡三角的第n行.
PPS我正在使用这些标志gcc-4.2在Powermac上进行编译:
-arch ppc64 -o gmpascal gmpascal.c -lgmp -Wall
Run Code Online (Sandbox Code Playgroud)
这里有什么我想念的吗?
请记住,我不对 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;
Run Code Online (Sandbox Code Playgroud)
知道值的数量和位深度的分配策略将是:
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;
}
Run Code Online (Sandbox Code Playgroud)
释放它(只是 free() 的包装,但你可能需要做一些我不熟悉的 gmp 清理):
void freeArray(CoolArray **pp)
{
if (*pp)
{
free(*pp);
*pp = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
使用它:
CoolArray *pca = allocArray(length, numbits);
Run Code Online (Sandbox Code Playgroud)
完成后释放它:
freeArray(&pca);
Run Code Online (Sandbox Code Playgroud)
这些只是想法,但也许你可以从中得到一些东西。