我想问你这个代码
#include <stdio.h>
#include "bit-array.h"
#ifndef BitArray
#define BitArray(array_name, size)\
int size_in_bits = size/sizeof(long);/*thanks to this, it should work on x64*/\
size_in_bits /= 8;/*conversion from bytes to bits*/\
int array_name[size_in_bits];/*declaration of an array*/\
for(int i = 0; i < size_in_bits; i++)/*filling the array by zeros*/\
array_name[i] = 0;\
#endif
int main()
{
BitArray(test, 100);
for(int i = 0; i < 100; i++)
printf("%d\n", test[i]);
return 0;
}
据我所知,这个宏BitArray(array_name,size)(放在单独的头文件bit-array.h中)应该用零来定义和填充数组,然后它应该将零打印到终端。 但是,它会从内存中打印一些随机数。我有点被困在这里。你能帮帮忙吗?
编辑:谢谢你的所有答案。我必须道歉,我忘了在这里写一件重要的事情。事实上,在这个任务中,这个原型必须是宏:BitArray(array_name,size)。答案 0 :(得分:2)
你正在创建一个(size / 8)元素数组,其中size == 100,但是然后打印出100个元素,而不是12个。
此代码存在各种其他问题但是......
答案 1 :(得分:1)
我会用这个:
#include <limits.h>
#define bit_array(type, varname, nbits) \
type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
用法:
bit_array(unsigned int, foo, 120); // maybe "unsigned int foo[4];"
您最好使用无符号整数类型作为数组的基本类型。
答案 2 :(得分:0)
你编写宏的方式,你最好只是将它作为一个函数并将其标记为内联。幸运的是,你不需要那么复杂。
Kerrek的答案非常接近,但是它有一个缺陷,如果你对类型使用unsigned char,你可以看到它,并且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:
#include <limits.h>
#define BitArray( type, varname, nbits ) \
type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
这样你的程序就变成了:
int main()
{
BitArray( uint32_t, test, 100 ); // same as uint32_t test[4] = {0};
for ( int i = 0; i < 4; i++ )
printf("%d\n", test[i]);
return 0;
}