5

我有一个这样的结构:

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

但是当我尝试使用它时,我遇到了分段错误。我还收到有关不正确使用 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;

我也改变了我的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;
}

这个没有段错误,但我在编译时收到有关错误使用的投诉mpz_array_init,并且我的输出中也出现了一堆malloc错误,以及我想查看的输出。谁能告诉我我的代码在哪里不正确?为什么第一个版本会出现段错误?我按照人们似乎推荐的方式做了。为什么编译器会抱怨 mpz_array_init使用不正确?

这是我在输出中遇到的那种错误:

gmpascal(80964) malloc: *** error for object 0x100801088: Non-aligned
pointer being freed *** set a breakpoint in malloc_error_break to debug

PS gmpascal是我的可执行文件的名称,它计算帕斯卡三角形的第 n 行。

我在带有这些标志gcc-4.2Powermac上编译的PPS :

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

我在这里想念什么吗?

4

2 回答 2

3

请记住,我不编写 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);

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

于 2012-10-25T18:18:01.203 回答
0

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

CoolArray *array = malloc(sizeof(CoolArray) + length * sizeof(mpz_t));
mpz_array_init(array->vals, length, numbits);
于 2012-10-25T21:21:15.333 回答