我们在平时写代码时经常遇见堆栈破环的情况,总结我自己在做题时遇到的情况,在此整理一下:
首先,什么是堆栈被破坏
堆栈被破坏通常指的是程序执行时访问了已经被释放或不存在的内存地址,从而导致程序崩溃或异
常退出。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i, j, t;
int a[10] = {3,6,2,5,9,7,8,0,1,4};
for ( i = 0; i < 10; i++)
{
for ( j = 0; j < 10 - i; j++)
{
if (a[j] > a[j + 1])
{
t = a[j+1];
a[j + 1] = a[j];
a[j] = t;
}
}
}
for (int i = 0; i < 10; i++)
{
cout << a[i]<<' ';
}
return 0;
}
如上面这个例子,是一个简单的冒泡排序,也是我经常发生的错误
错误原因是将冒泡排序中j的循环判断条件写错了应该是j < 10 - i - 1(这里的n一般是数组的长度)
若为j < 10 - i;
就会导致在第一轮排序时,p[9]与p[10]进行比较,但是根本不存在p[10]这个变量,访问不存在的地址,自然是非法操作,会导致程序崩溃,崩溃原因就是“堆栈被破坏”。