int main()
{
int arr[3];
int *a;
arr [5] = 6; // out of bound but it will not give error.
// J: False - it is undefined. expect raptors, or something.
arr [3000] = 8 ; //SEGSEV
// J: Now you see the effects of undefined behavior, even though you did not in a previous invalid access.
a = malloc (sizeof (int));
a[4] = 6; // J: Still undefined behavior
a[4000] = 8; //No error
// J: Still undefined behavior
}
Но я не понимаю, почему [4000] не даст мне никакой ошибки времени выполнения, т. Е. Сегцев сигнал.
Это будет на другой платформе или архитектуре. Это действительно не имеет значения - вы всегда должны избегать UB.
В любом случае, разница заключается в реализации распределителя вашей системы (при условии, что компилятор не поместил результат malloc в стек).
То, как ваш распределитель управляет и распределяет память, является деталью реализации, на которую вы не должны полагаться, особенно когда вы бросаете UB.
Распределитель может продавать части памяти из большего физического распределения. Эта базовая реализация зависит от платформы.