I fixed everything and printing works now. do you have any idea why segault came?
Code:
#include <stdio.h>
#include <stdlib.h>


#define on 1
#define off 0


typedef struct Node node;


struct Node{
  unsigned int value;
  struct Node* left;
  unsigned int left_edge : 1;
  struct Node* right;
  unsigned int right_edge : 1;
};


void print_tree(node* root){
  printf("%s = %d\n", "value of node ", root->value);
  if (root->left != NULL){
    print_tree(root->left);
  }
  if (root->right != NULL){
    print_tree(root->right);
  }


}


int main(){


  node a = {1,NULL,0,NULL,0};
  node b = {2,NULL,0,NULL,0};
  node c = {3,NULL,0,NULL,0};
  node d = {4,NULL,0,NULL,0};
  node e = {5,NULL,0,NULL,0};
  node f = {6,NULL,0,NULL,0};
  node g = {7,NULL,0,NULL,0};
  node h = {8,NULL,0,NULL,0};


  node inner_3 = {0, &a, 0, &b, 1};
  node inner_4 = {0, &c, 1, &c, 0};
  node inner_5 = {0, &e, 1, &f, 0};
  node inner_6 = {0, &g, 1, &h, 0};


  node inner_2 = {0, &inner_5, 1, &inner_6, 0};
  // the error does not occur because I did not reserve space for the object with malloc.
  node* inner_1 = malloc(sizeof(node));
  inner_1->value = 2;
  inner_1->left = &inner_3;
  inner_1->right = &inner_4;
  inner_1->left_edge = 1;
  node root = {0, inner_1, 0, &inner_2, 1};


  print_tree(&root);


  return 0;


}