My C Compiler blew up , when i tried changing some address values , please tell me why? : Have a look at my code :

 

     #include <stdio.h>
     #include <limits.h>

    int main (int argc, const char *argv[]) {

    typedef unsigned char byte;

    byte *pointer;
    byte b1=1;
    byte b2=2;
    int i1 =4;
    int i2 =0x12345678;
    byte b3=5;
    byte b4=6;
    byte b5=7;
    byte b6=9;

    //pointer = &b6;
    pointer = (byte*)&i2;
    printf("pointer  has value %p\n", pointer);
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    *pointer = 255;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    *pointer = 45;
    printf("the byte it points to contains %x\n", *pointer);
    pointer =  pointer + 1;
    *pointer = 34;

    printf("the byte it points to contains %x\n", *pointer);
    //printf("How big is int in this machine? %d\n", INT_MAX);
    //insert code here ...
    printf (" b1 (%p) = %x\n", &b1, b1);
    printf (" b2 (%p) = %x\n", &b2, b2);
    printf (" i1 (%p) = %d\n", &i1, i1);
    printf (" i2 (%p) = %x\n", &i2, i2);
    printf (" b3 (%p) = %x\n", &b3, b3);
    printf (" b4 (%p) = %x\n", &b4, b4);
    printf (" b5 (%p) = %x\n", &b5, b5);
    printf (" b6 (%p) = %x\n", &b6, b6);

    return 0;
    }

The line saying ***pointer = 255;** , maybe 40th line , the compiler blows , or the code stops working , saying this 
[if I make , *pointer = 255 or *pointer = 254][1]

[and if I set any other values except this , my program works well i.e. 
 *pointer = 4556 or *pointer = 45 ][2]


  [1]: http://i.stack.imgur.com/DMRtm.jpg
  [2]: http://i.stack.imgur.com/h2DAh.jpg

Or in case of any other arbitrary values as well  , it runs without any blow . Please tell me about this behaviour of addresses.

*Source : Prof. Richard Buckland , I'm exploring all these due to his guidance.*