堆栈溢出C ++(stack overflow c++)

2019-08-05 18:57发布

所以我,试图解决的任务。 一个已经有了代码,但系统出局,“堆栈溢出”我是在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");


}

看起来像算法正常工作,但唯一的问题是堆栈。 非常感谢!

Answer 1:

根本原因:

正如你猜中,堆栈是有限的,似乎你的配置是足够大,通过它可以照顾。 这是不是一种语言的语法错误,因此不保证编译错误,但它会导致运行时异常从而导致飞机坠毁。

解决方案1:

您可以在阵列全球,全球的列阵的分配是不栈因此它应该为你工作得很好:

int a [200000];

int main()
{
   .....
}

方案2:

你可以使用一个std::vector

解决方案3:

您可以通过使用动态分配new



Answer 2:

语句int a [200000]; 尝试分配堆栈比将适合,这造成堆栈溢出上更多的内存。 有些人建议超过几KB更大的阵列应该是动态的,而不是分配为一个局部变量。 请参考维基百科: http://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables



Answer 3:

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");
}


文章来源: stack overflow c++