在最近的一个测试问题中,我被要求打印以下程序的输出。我得到了正确的答案,但是这个程序给我带来了极大的精神痛苦,因为我不知道在写入超出数组范围的内存时会发生什么行为。
这是有问题的程序,评论是我的笔记:
#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 值会写入哪里?我尝试在不同的设置下编译它,看看我是否可以让它两次写入它不应该的东西,但我尝试过的一切都导致了没有任何段错误的确切输出。