Answers:
当一段代码操纵内存而没有意识到另一段代码正在以冲突的方式使用该内存时,内存就会“踩踏”。有几种常见的可以踩踏内存的方式。
一种是分配例如100字节的内存,然后再存储第100个地址之后的内容。该内存可能用于保存完全不同的内容。这特别难以调试,因为当某些东西尝试访问被踩踏的受害者时,问题就会出现,并且踩踏在其上的代码可能完全不相关。
另一个是在释放内存后访问内存。存储器可以被分配给另一个对象。同样,显示问题的代码可能与具有相同地址的新分配对象有关,而与导致问题的代码无关。
其他答案基本上是正确的,但我想举一个例子。
int a[10], i;
for (i = 0; i < 11 ; i++)
a[i] = 0;
int i, a[10];
for (i = 0; i < 11 ; i++)
a[i] = 0;
这些样本可能导致无限循环(或可能不导致),因为这是不确定的行为。
i
内存中的变量很可能存储在数组之后。因此,访问a[10]
实际上可以访问i
,换句话说,它可以重置循环计数器。
我认为这是一个很好的例子,展示了内存“踩踏”。