That a program might run out of memory is one of the simpler ways in which
the physical nature of execution could affect the way we write programs.
Often, the effects are more subtle. Consider the following code,
which is intended to fill an array with integers, starting with zero:
#define ARRAY_SIZE 10
void natural_numbers (void) {
int i;
int array[ARRAY_SIZE];
i = 1;
while (i <= ARRAY_SIZE ) {
printf("%d ",i);
array[i] = i - 1;
i = i + 1;
}
}
When invoked, the procedure natural_numbers will never return. That's right,
never. But it seems pretty harmless, doesn't it? The loop is certainly not an
infinite loop: its index i starts at 1 and ends at ARRAY_SIZE.
Briefly, the problem is that the compiler allocates the variable i to a location
in memory that is right at the end of the memory allocated to array, so that
setting array[10] has the unintended effect of setting the value of i.
本文探讨了一段看似正常的程序代码为何会导致程序无法返回的问题。该程序试图将一系列整数填充到数组中,但由于编译器对变量内存分配不当,意外修改了循环变量的值,从而引发无限循环。
5333

被折叠的 条评论
为什么被折叠?



