我正在尝试重写我编写的一个数组,我要添加的一个功能是可以轻松地在位数组中设置值。现在,我的位数组看起来像这样:
typedef struct{
int length;
char bitarray[];
}BitArray;
我正在尝试编写一个函数:
void initBitArray(BitArray * b, int numBits, int initVal);
将numBits和bitarray的长度设置为numBits / 8 + 1 long的字符数组,每个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: ========
答案 0 :(得分: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'不同,灵活的阵列成员机制允许您准确分配所需的空间,而不是 - 可靠且可移植地分配。
答案 1 :(得分:1)
首先,具有灵活数组成员的结构只能动态分配(即使用* alloc系列函数)。因此,要调整bitarray[]
成员的大小,您需要在BitArray指针上调用realloc
,其新大小为sizeof(BitArray) + flexible_member_size_you_want
。
可以像访问所有其他成员一样访问灵活成员,即
BitArray *b = /* ... */;
b->length = /* ... */;
b->bitarray[0] = /* ... */;