The members of an automatic storage object such as n1 do not get zero-initialized automatically (See C11 standard, 6.7.9.10). You have to do this yourself.
You can take care of this easily by suitably initializing n1:
struct node n1 = {1};
This will set the first member to 1 and will zero-initialize the rest, meaning the pointers get initialized to NULL. You can be more explicit if you wish:
struct node n1 = {1, NULL, NULL};
References:
From the C11 standard, 6.7.9 Initialization:
  
  - If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in
  a string literal used to initialize an array of known size than there
  are elements in the array, the remainder of the aggregate shall be
  initialized implicitly the same as objects that have static storage
  duration.
And, previously in the same section,
  
  - ... If an object that has static or thread storage duration is not initialized explicitly, then:
 — if it has pointer type, it is
  initialized to a null pointer;
(emphasis mine)
     
    
0x2000000000000000and0x7fff7cbd0010. If I print their label member, I have a segmentation fault.struct node n1 = { .lchild = NULL}also boring?n1on the stack; C makes no guarantees about the initial values of stack-allocated variables, and they can and usually will contain random garbage. If you want them to contain specific values, you'll have to take care of that yourself. You could declare a function to do this for you:struct node* initNode(struct node* newNode)- sets the fields to their proper initial values and returns the pointer to the same struct.