2

私が書いたビット配列のものを書き直そうとしているのですが、追加したかったことの1つは、ビット配列に値を簡単に設定できるようにする機能です。現在、私のビット配列は次のようになっています。

typedef struct{
  int length;
  char bitarray[];
}BitArray;

関数を書き込もうとしています:

void initBitArray(BitArray * b, int numBits, int initVal);

length を numBits に、bitarray を numBits/8 + 1 の長さの char の配列に設定し、各 char の値は initVal です。私が問題を抱えている唯一の部分は、bitarray の値を設定することです。これは宿題でもなんでもありません。趣味のコードをもっときれいにしようとしていただけです。これは私がやろうとしたことです:

void initBitArray(BitArray * b, int numBits, int initVal){
  char foo[numBits/8 + 1]; 
  b->bitarray = foo;
  int i;
  for (i=0; i<numBits/8 + 1; ++i){
    b->bitarray[i]=val;
  }
  b->length = numBits;
  return;
}

明らかにこれは機能しません:p

私はこれを試しました:

void initBitArray(BitArray * b, int numBits, int initVal){
  b = (BitArray *)realloc( b, sizeof(b) + numBits/8 + 1);
  b->length = numBits;
  int i;
  for (i=0; i< (b->length); ++i){
    b->bitarray[i]=initVal;
  }
  return;
}

コンパイルはできますが、実行時エラーが発生しますか?

*** glibc detected *** ./prog: realloc(): invalid old size: 0xbfe573f0 ***
======= Backtrace: =========
/lib/libc.so.6[0xb76c0fd4]
/lib/libc.so.6[0xb76c4a29]
/lib/libc.so.6(realloc+0x107)[0xb76c5657]
/lib/libc.so.6(realloc+0x3c)[0xb76c558c]
./prog[0x8048556]
./prog[0x80483f1]
======= Memory map: ========
4

2 に答える 2

3
BitArray *allocBitArray(int length)
{
    BitArray *ba = malloc(sizeof(BitArray) + length);
    if (ba != 0)
    {
        ba->length = length;
        for (i = 0; i < length; i++)
             ba->bitarray[i] = 0;
    }
    return ba;
}

他の方法でループを実行することもできます。たとえば、 を使用memset()したり、calloc()代わりに を使用したりできますmalloc()。C99 以前の「構造体ハック」とは異なり、柔軟な配列メンバー メカニズムにより、必要なスペースを正確に割り当てることができ、それ以上は不要であることに注意してください。確実かつ移植可能です。

于 2012-08-14T02:49:53.553 に答える
1

まず第一に、柔軟な配列メンバーを持つ構造体は、動的にのみ割り当てることができます (つまり、関数の *alloc ファミリを使用)。したがって、bitarray[]メンバーのサイズを変更するreallocには、新しいサイズの BitArray ポインターを呼び出しますsizeof(BitArray) + flexible_member_size_you_want

柔軟なメンバーは、他のすべてのメンバーと同様にアクセスされます。

BitArray *b = /* ... */;
b->length = /* ... */;
b->bitarray[0] = /* ... */;
于 2012-08-14T00:40:36.037 に答える