Eu achava que arrays eram considerados estruturas de dados estáticas .
Então executamos isto:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[5] = {10,20,30,40,50};
a[5] = 100;
a[6] = 200;
printf("Out of bounds %d, %d", a[5], a[6]);
return 0;
}
Isso retorna Out of bounds 100 200
e termina normalmente. POR QUÊ?
Por que 200 é declarado e retornado normalmente se a[5]
é estático?
Tudo me leva à conclusão de que o gcc trata matrizes como estruturas de dados dinâmicas.
Estou certo? O que está acontecendo?
Arrays estáticos têm um tamanho fixo especificado em tempo de compilação, e arrays de comprimento variável têm um tamanho fixo determinado em tempo de execução. O compilador não realiza verificação de limites em arrays em tempo de execução.
Seu código tem um comportamento indefinido , pois você está acessando seu array fora dos limites , então literalmente qualquer coisa pode acontecer, inclusive o código aparentemente funcionar.
O compilador não redimensiona um array dinamicamente em tempo de execução quando você o acessa fora dos limites. Você está simplesmente corrompendo a memória ao redor ao escrever fora do array. No seu exemplo, seu código não trava porque está acessando memória válida, mas ainda assim é memória que o array não possui.