Что происходит, когда вы пишете в память вне границ массива?

На недавнем тестовом вопросе меня попросили напечатать вывод следующей программы. Я получил правильный ответ, однако эта программа вызвала у меня сильную душевную боль, так как я не знал, как будет вести себя при записи в память, выходящую за пределы массива.

Вот программа под вопросом, комментарии мои заметки:

#include <stdio.h>

#define MAX 4

void RecordArgs(int x);

int main()
{
    RecordArgs(1);
    RecordArgs(7);
    RecordArgs(-11);
    return 0;
}

void RecordArgs(int x)
{
    static int i = 0;
    int call_count = 0;
    int arg_history[MAX] = {0};
    if (call_count == MAX)
    {
        # call_count is not static and is initialized to 0 on each call
        # as a result, under no circumstance can call_count == MAX and
        # this printf is never executed
        printf("Too many calls to RecordArgs\n");
    }
    else
    {
        # index out of bounds on second/third call (i + call_count will be 4??)  
        arg_history[i + call_count] = x;
        ++call_count;
        ++i;
        for (i = 0; i < MAX; ++i)
            printf("%d ", arg_history[i]);
        printf("\n");
    }
}

И ожидаемый результат:

1 0 0 0
0 0 0 0
0 0 0 0

Когда RecordArgs вызывается второй и третий раз, где записываются значения 7 и -11? Я попытался скомпилировать его с разными настройками, чтобы посмотреть, смогу ли я получить два, записать что-то, чего не должен, но все, что я пробовал, привело к точному выводу без каких-либо ошибок.

Ответы на вопрос(1)

Ваш ответ на вопрос