【问题标题】:Bit wise operation in pointer, unsigned char [closed]指针中的按位操作,无符号字符 [关闭]
【发布时间】:2017-11-03 21:06:30
【问题描述】:

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

【问题讨论】:

  • 能否请您显示调用addbit 的代码,包括参数的定义?
  • 1 &lt;&lt; bit 错误,但不会出现段错误
  • 我会尝试在一个最小的例子中重现这个问题,你是对的
  • 在某处需要% CHAR_BIT

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


【解决方案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 ...

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 关于 shift 命令的重要提示。谢谢,我会把它放在我的项目中
    【解决方案3】:

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

    【讨论】:

    • 这是什么意思? bitv[a] |= 1 &lt; 只是 C 语句的一个片段(在一个句子的片段中)。和“正确初始化位向量”?从您的问题或您的自我回答中根本不清楚问题是什么或如何解决的。您从未为您的问题提供过minimal reproducible example。请记住,Stack Overflow 的目的之一是为可搜索的问题提供完整的答案,这可以帮助找到问题的人,而不仅仅是提出问题的人。如果答案未知,这对您来说似乎是一个不错的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多