我正在尝试将unsigned char变量的一位更改为1.虽然我仍然遇到分段错误。这是失败的代码片段:
// Canvas canvas = new Canvas();
YourCustomCanvas canvas = new YourCustomCanvas();
...
unsigned char bitvector[16];
int addbit(unsigned char *bitv,int bit){
int a = bit/CHAR_BIT; //part of char array we want. CHAR_BIT is 8
bitv[a] |= 1 <<bit;
return 1
}
编译: make:*** [all]分段错误(核心转储)
答案 0 :(得分:1)
由于您的问题不明确,我假设您想要更改(16x8位)字的位n。这是一个有效的例子:
#define CHAR_BIT 8
int addbit(unsigned char *bitv,int bit)
{
int a = bit/CHAR_BIT; //part of char array we want. CHAR_BIT is 8
bitv[a] |= 1 <<(bit%CHAR_BIT);
return 1;
}
int main()
{
unsigned char bitvector[16]={0};
addbit(bitvector,9);
for (int i=0;i<16;i++)
printf ("%x ",bitvector[i]);
}
显示:0 2 0 0 0 0 ...
答案 1 :(得分:1)
分段错误表示您在尚未分配的内存区域中执行某些操作。典型的原因是您的i
太大,并且您尝试访问超出bitv
指针引用的已分配区域的内存。另一个常见原因是你已经释放了记忆。
另外,您应该将1 << bit
更改为1 << (bit % 8)
。否则例如addbit(ptr, 9)
会在bitv [1]处导致第9位。该位将被设置,但该值在分配时被截断。
答案 2 :(得分:-1)
事实证明,问题在于bitvector的正确初始化。对于按位运算符bitv [a] | = 1&lt;