Sin error fuera de límites

Tengo este código en C que toma un montón dechars

#include<stdio.h> 
# define NEWLINE '\n'
int main()
{

char c;
char str[6];
int i = 0;
while( ((c = getchar()) != NEWLINE))
{
        str[i] = c;
        ++i;
        printf("%d\n", i);
}

return 0;
}

Input es: testtesttest

Salida: 1 2 3 4 5 6 7 8 117 118 119 120

Mis preguntas son:

¿Por qué no obtengo una excepción fuera de los límites (falla de segmentación) aunque claramente supero la capacidad de la matriz?

¿Por qué los números en la salida de repente saltan a números muy grandes?

Intenté esto en C ++ y obtuve el mismo comportamiento. ¿Alguien podría explicar cuál es la razón de esto?

Respuestas a la pregunta(16)

Su respuesta a la pregunta