2

我正在尝试重写我写的位数组,我想添加的一件事是一个函数,它可以很容易地设置位数组中的值。现在,我的位数组看起来像这样:

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

我正在尝试编写一个函数:

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

将长度设置为 numBits,将 bitarray 设置为 numBits/8 + 1 长的字符数组,每个字符都有一个值 initVal。我唯一遇到的问题是设置位数组的值。这不是作业或任何东西,我只是想让一些爱好代码更漂亮。这就是我试图做的:

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 之前的“struct hack”不同,灵活的数组成员机制允许您准确地分配您需要的空间,而不是更多 — 可靠且可移植。

于 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 回答