C 有關記憶體的小謎題

xOuOx發表於2015-11-04

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()又一次重新使用同一堆疊

相關文章