I have created a linked list with the following code. As you can see, I have used malloc to created a list of size 3. But I ran the for loop over size 10 to initialize and print.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct node {
        int value;
        struct node *next;
};
int main() {
        //code
        struct node **head;
        struct node *curr;
        curr = (struct node *) malloc(sizeof(struct node)*3);
        head = &curr;
        printf("done 1\n");
        (*head)->value = 0;
        (*head)->next = NULL;
        for(int i = 1; i < 10; i++) {
                (*head+i-1)->next = (*head+i);
                (*head+i)->value = i;
                (*head+i)->next = NULL;
        }
        curr = *head;
        printf("done 2\n");
        for(int i = 0; i < 10; i++) {
                printf("%d\t", (*head + i)->value);
                //curr = curr->next;
        }
        printf("\ndone 3\n");
        //free(curr);
        return 0;
}
when I compile and run the code, the result obtained is,
done 1
done 2
0   1   2   3   154208560   842282289   876087600   154744882   808859448   875837236
done 3
Why am I able to assign values to the 4th node and access it when I actually created a list of size 3?
I see that garbage values were being printed from 5th to 10th node access. But how is the 4th node being created?
P.S:
I know that 10!=3. The code ran properly when I put the loop in its limits. I wanted to see what will happen when we go out of bounds. I see that the 4th node was also created as I was able to assign value when I actually created a list of size 3.
This is purely to see if I will get seg fault or not.
 
     
    