Diferença entre o tipo de array e array alocado com malloc

Hoje eu estava ajudando um amigo meu com algum código em C, e encontrei um comportamento estranho que não consegui explicar por que estava acontecendo. Nós tínhamos um arquivo TSV com uma lista de inteiros, com um int em cada linha. A primeira linha era o número de linhas que a lista tinha.

Nós também tínhamos um arquivo c com um "readfile" muito simples. A primeira linha foi lida para n, o número de linhas e, em seguida, houve uma inicialização de:

int list[n]

e finalmente um loop for de n com um fscanf.

Para n pequenos (até ~ 100.000), tudo estava bem. No entanto, descobrimos que quando n era grande (10 ^ 6), ocorreria um segfault.

Finalmente, mudamos a inicialização da lista para

int *list = malloc(n*sizeof(int))

e tudo bem, mesmo com n muito grande.

Alguém pode explicar por que isso ocorreu? o que estava causando o segfault com int list [n], que foi interrompido quando começamos a usar list = malloc (n * sizeof (int))?