ndice @Array fora do limite em C

PorqueC diferencia no caso de índice de matriz fora do limite

#include <stdio.h>
int main()
{
    int a[10];
    a[3]=4;
    a[11]=3;//does not give segmentation fault
    a[25]=4;//does not give segmentation fault
    a[20000]=3; //gives segmentation fault
    return 0;
}

Entendo que ele está tentando acessar a memória alocada para processar ou encadear no caso dea[11] oua[25] e está saindo dos limites da pilha no caso dea[20000].

Por que o compilador ou o vinculador não dão um erro, eles não estão cientes do tamanho da matriz? Se não, então comosizeof(a) funciona corretamente?