-2

我正在尝试将 unsigned char 变量的一位更改为 1。不过,我一直遇到分段错误。这是失败的代码片段:

    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
}

...

if(checkbit(pointer->bitvector,i)==0){
//checkbit works great! bitv[0] has the value of 71, 
//a turns to be 0 when I call it
            addbit(pointer->bitvector,i);

编译:make:*** [all] 分段错误(核心转储)

4

3 回答 3

1

由于您的问题不清楚,我假设您想更改(16x8bits)单词的位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 ...

于 2017-11-03T21:30:26.353 回答
1

分段错误表明您在尚未分配的内存区域中执行某些操作。一个典型的原因是您i的内存太大,并且您尝试访问超出bitv指针引用的分配区域的内存。另一个常见的原因是您已经释放了内存。

此外,您应该更改1 << bit1 << (bit % 8). 否则,例如addbit(ptr, 9)将导致 bitv[1] 处的第 9 位。该位将被设置,但该值在分配时被截断。

于 2017-11-03T21:31:07.823 回答
-1

事实证明,问题出在位向量的正确初始化上。至于按位运算符 bitv[a] |= 1 <

于 2017-11-03T21:38:18.073 回答