2013-01-06 270 views
0

所以我',試圖解決一個任務。 一個已有代碼,但系統出局,「堆棧溢出」 我是在C++的新和我的英語不是很好,所以我很誤解對不起=)堆棧溢出C++

#include <iostream> 

using namespace std; 

int main(){ 
    int n; 
    int x; 
    int k = 0; // счетчик для рабочего массива 
    int a [200000]; 
scanf("%d\n",&n); 

for (int i = 0; i< n; ++i){ 
    std::cin >> x; 
    if (x > 0){ 
      k++; 
      a[k] = x; 
      }else if(x == 0){ 
       for (int q = 1; q <= k; ++q){ // копирование 
          a[k+q] = a[q]; 
        } 
       k *= 2; 
       }else{ 
          printf("%d %d\n",a[k],k); 
          k--; 
         } 
    } 
    system("pause"); 


} 

看起來像算法正常工作,但唯一的問題是堆棧。非常感謝!

+2

嘗試使陣列'A'全球性的,即,移動它'main'之外。 –

+0

爲未來,stackoverflow =動態分配/ s的問題,你可能想讀一些關於在C++中的分配機制 – user1824407

+2

誰不絕對*愛*混合stdlib流io('std :: cin >> x')與cstdio('scanf(「%d \ n」,&n);')。 – WhozCraig

回答

6

根本原因:

正如你猜中,堆棧是有限的,似乎你的配置是足夠大,通過它可以照顧。這不是語言語法錯誤,所以它不保證編譯錯誤,但會導致運行時異常,從而導致崩潰。

解決方案1:

您可以在陣列全球,一個全球列陣的分配是不是棧所以它應該爲你工作得很好:

int a [200000]; 

int main() 
{ 
    ..... 
} 

解決方案2:

你可以使用一個std::vector

解決方案3:

您可以通過new使用動態分配。

+1

解決方案4:你可以大大減少你的數組大小**和**過濾器檢查用戶輸入,順便說一下,這可以目前*仍然* overrun你的200000元素數組輸入200001,一個完全有效的'int'。(哦,+1,很好的答案) – WhozCraig

+0

+1,因爲它封裝了內存管理。 –

+1

@Who zCraig:這個!我相信正確的答案是從數組切換到關聯容器。 –

0

3個變化我可以看到。
1 - 在堆棧上分配多於堆棧可以處理的內容。
2-k應始終指向下一個可用空間,因此您需要更新而不是增加它。
3 - 索引從「0」開始,均爲「q」。

固定碼:

#include <iostream> 

using namespace std; 

int a [200000]; 

int main(){ 
    int n; 
    int x; 
    int k = 0; // счетчик для рабочего массива 
scanf("%d\n",&n); 

for (int i = 0; i< n; ++i){ 
    std::cin >> x; 
    if (x > 0) 
    { 
      a[k] = x; 
      k++; //<< change 1 
    } 
    else if (x == 0) 
    { 
     for (int q = 0; q <= k; ++q) //<<change 2 
     { // копирование 
      a[k+q] = a[q]; 
     } 
     k *= 2; 
    } 
    else 
    { 
     printf("%d %d\n",a[k],k); 
     k--; 
         } 
} 
system("pause"); 
}