2012-01-31 84 views
0

我在這裏有一個小問題。每當我運行下面的代碼時,我的程序就會崩潰。程序崩潰數組索引分配

void Wingcod::push(byte b) 
{ 
    stack[stackp] = b; 
    stackp++; 
    if(stackp >= stacks) 
    { 
     stacks += 16; 
     try 
     { 
      realloc(stack,stacks); 
     }catch(bad_alloc*) 
     { 
      cerr << "STACK OVERFLOW"; 
      exit(1); 
     } 
    } 
} 

和堆棧,stackp和堆棧的定義是這樣的:

stacks = 8; 
stackp = 0; 
stack = new byte[stacks]; 

和字節僅僅是一個unsigned char

+0

你聲明瞭什麼類型的堆棧? – TJD 2012-01-31 20:37:18

+0

您是否嘗試使用斷點進行調試並查看會發生什麼? – 2012-01-31 20:37:24

+4

爲什麼不使用C++呢?你可以有一個方便的'std :: vector ',它完全符合你的需求。 – 2012-01-31 20:39:13

回答

6

對於分配了new的指針,您不允許使用realloc()

也許你可以試試下面的不是realloc()

 byte* tmp = new byte[stacks]; 
     delete [] stack; 
     stack = tmp; 
4

realloc不會引發異常,因爲它是不相關的new,但是C的malloc。它也不會設置指針。

stacks = 8; 
stackp = 0; 
stack = static_cast<byte*>(malloc(stacks * sizeof(byte))); 

void Wingcod::push(byte b) 
{ 
    stack[stackp] = b; 
    stackp++; 
    if(stackp >= stacks) 
    { 
     stacks += 16; 
     if(!(stack = static_cast<byte*>(realloc(stack,stacks * sizeof(byte))))) { 
      cerr << "STACK OVERFLOW"; 
      exit(1); 
     } 
    } 
} 
+0

「不改變指針」似乎是崩潰的重要組成部分。 – 2012-01-31 20:46:50

+0

是的,這是一個解決方案,但不是我目前的問題。你看到崩潰發生在函數的第一行,我第一次運行它。 – NullData 2012-01-31 20:49:38

+0

@TheBreadCat調用者是否有效? – Pubby 2012-01-31 20:53:57

4

您不能使用new T[n]分配的指針爲realloc()參數。使用realloc()的指針必須來自malloc()系列函數(malloc()calloc()realloc())。就個人而言,我不會使用任何這些,而是​​使用std::vector<T>

0

here,Realloc只對先前由alloc分配的內存指針有效。嘗試使用malloc