在尝试操作位时出现分段错误

时间:2015-03-10 23:55:29

标签: c pointers bit-shift bits

我正在通过一本名为“计算机系统:程序员的视角”的书来学习,以获得对现代计算机内部运作的一些见解。

今晚我试图查看int和unsigned的内部以查看它们的位数。我想出了这个:

#include <stdbool.h>
#include <stdio.h>
typedef unsigned char * byte_pointer;
void bp2b(byte_pointer bp, bool bits[8]){
   unsigned char n;
   for (n = 0; n<8; n++){
      if (*bp & (1 << n))
         bits[7-n] = true;
      else bits[7-n] = false;
   }
}
void show_byte(byte_pointer bp){
   int ind;
   bool bits[8];
   bp2b(bp, bits);
   for (ind = 0; ind < 8; ind++){
      printf("%d",bits[ind]);
   }
   printf("\n");
}

int main(void){
   int x;
   x = 1;
   show_byte((byte_pointer) x);
}

为什么我会遇到段错误?我对C的了解相当有限,所以不要犹豫,指出对你来说显而易见的错误。

编辑:忘了主要功能。

1 个答案:

答案 0 :(得分:2)

您将非指针值转换为指针:(byte_pointer) x,然后取消引用它,这不会起作用。请尝试使用x的地址并将其转换为:(byte_pointer) &x

进行此更改并且您的程序将运行,但请注意,将int转换为unsigned char可能会导致信息丢失,因为unsigned char的类型比int更窄(在大多数实现中)。

设置x = 255将产生11111111,而设置x = 256将产生00000000