指针中的按位操作,unsigned char

时间:2017-11-03 21:06:31

标签: c pointers bitwise-operators bit-shift bitwise-xor

我正在尝试将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]分段错误(核心转储)

3 个答案:

答案 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;