> Then running b.c will segfault
why would it not ? On one side you declare an int array of size 1, on the other side you declare a pointer. Think about what's going on with the bytes :
int n[] = { 1 };
will look exactly the same in memory than int n = 1;
which is of course not compatible with int* n = 1;
Arrays by themselves have no indirection in C.