访问超出已分配块的内存
指向包含 n
元素的内存块的指针只有在 memory
和 memory + (n - 1)
范围内时才能被取消引用。取消引用该范围之外的指针会导致未定义的行为。例如,请考虑以下代码:
int array[3];
int *beyond_array = array + 3;
*beyond_array = 0; /* Accesses memory that has not been allocated. */
第三行访问数组中的第 4 个元素,该元素只有 3 个元素长,导致未定义的行为。类似地,以下代码片段中第二行的行为也没有很好地定义:
int array[3];
array[3] = 0;
请注意,指向数组的最后一个元素并不是未定义的行为(此处定义了 beyond_array = array + 3
),但取消引用它是(*beyond_array
是未定义的行为)。此规则也适用于动态分配的内存(例如通过 malloc
创建的缓冲区)。