Что происходит, когда вы пишете в память вне границ массива?
На недавнем тестовом вопросе меня попросили напечатать вывод следующей программы. Я получил правильный ответ, однако эта программа вызвала у меня сильную душевную боль, так как я не знал, как будет вести себя при записи в память, выходящую за пределы массива.
Вот программа под вопросом, комментарии мои заметки:
#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? Я попытался скомпилировать его с разными настройками, чтобы посмотреть, смогу ли я получить два, записать что-то, чего не должен, но все, что я пробовал, привело к точному выводу без каких-либо ошибок.