 <p>This is the same case as with forward declaration of class/struct type:</p> <pre><code>struct node; struct node* node_ptr; /* is valid */ struct node node_instance; /* is invalid */ </code></pre> <p>So <code>struct node;</code> basically says: hey there is a structure defined somewhere outside this file. The type is valid, pointers may be used, but you cannot instantiate the object.</p> <p>This is because the size of the pointer is known and is specific to the target architecture (e.g. 32 or 64-bit). The size of the structure is unknown until declared.</p> <p>When you declare the type completey, then you will be allowed to declare the object of that type:</p> <pre><code>struct node { int a; struct node* b; /* this will work, but the size of struct is unknown yet */ } struct node* node_ptr; /* this works always with full and forward declarations */ struct node node_object; /* now, the size of struct is known, so the instance may be created */ </code></pre>