1.破坏计数:

int main()
{
    int i;
    int array[4];
    for(i=0;i<=4;i++){
        array[i] = 0;
    }
    return 0;
}

堆栈中:

  • | sava pc
  • | i (即array 4)
  • | array 3
  • | array 2
  • | array 1
  • | array 0

当i到达4时,array[4]=0会将i置换为0,从而无限迭代

2.重置返回地址:

int foo()
{
    int array[4];
    int i;
    for(i=0;i<=4;i++){
        array[i] -= 4;
    }
    return 0;
}

堆栈中:

  • | save pc (即array + 4)

  • | array + 3

  • | array + 2

  • | array + 1

  • | array + 0

  • | i

每次迭代的array + 4,即save pc处,将返回地址减4,又会再次调用此函数,从而无限迭代

3.重用堆栈

int main()
{
    newIntArray();
    printArray();
    return 0;
}

void newIntArray()
{
    int array(100);
    for(int i = 0; i < 100; i++)
        array[i] = i; 
}  

void printArray()
{
    int array[100];
    for(int i = 0; i < 100; i++)
        print("%d,", array[i]);
 }  

输出结果:1,2,3,4,5,6,7, ...........100,
堆栈中:

  • | save pc

  • | array 99

  • | array 98

  • | array 97

  • | ..........

  • | array 1

  • | array 0

即newIntArray()在堆栈中创建数据后,printArray()又一次重新使用同一堆栈