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 の不適切な使用に関する苦情も寄せられています。しかし、マヌラを見てきましたが、これを正しく行っているようです。

また、次のように構造体を使用しようとしました。

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

これは segfault ではありませんが、コンパイル時に の不適切な使用について苦情を受けます。また、見たい出力と一緒に、出力に大量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

PS gmpascalは私の実行可能ファイルの名前で、パスカル三角形の n 番目の行を計算します。

gcc-4.2これらのフラグを使用してPowermacでコンパイルしている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

If you're using a flexible array member, you need to allocate the struct in one go:

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