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.