This simple code (adding element to linked list and printing it) works fine
#include <stdio.h>
struct node{
    int item;
    struct node* next;
};
void print_node (struct node* n){
    while (n!= NULL){
        printf("%d ", (*n).item);
        n = n->next;
    }
    printf("\n");
}
void append_node(struct node *list, struct node *n){
    while(list->next != NULL)
        list = list->next;
    list->next = n;
}
int main(){
    struct node n1, n2;
    n1.item = 1;
    n1.next = NULL;
    n2.item = 2;
    n2.next = NULL;
    print_node(&n1);
    print_node(&n2);
    append_node(&n1,&n2);
    print_node(&n1);
    printf("done\n");
    return 0;
}
If instead I define the append_node as following
void append_node(struct node *list, struct node n){
    while(list->next != NULL)
        list = list->next;
    list->next = &n;
}
and call it accordingly in the main (i.e., append_node(&n1, n2) ) I get a segmentation fault when running the program. And I don't understand why :)
 
     
    