0

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


}

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

4

3 回答 3

6

根本原因:

正如您猜对的那样,堆栈是有限的,并且您的分配似乎足够大,可以通过它来满足。这不是语言语法错误,因此不保证编译错误,但会导致运行时异常,从而导致崩溃。

解决方案1:

您可以使数组全局化,全局数组的分配不在堆栈上,因此它应该适合您:

int a [200000];

int main()
{
   .....
}

解决方案2:

你可以使用一个std::vector

解决方案3:

您可以通过new.

于 2013-01-06T12:35:45.790 回答
2

语句int a [200000];尝试在堆栈上分配超出容量的内存,从而导致堆栈溢出。有些人建议应该动态分配大于几千字节的数组,而不是作为局部变量。请参考维基百科:http ://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables

于 2013-01-06T12:37:05.073 回答
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");
}
于 2013-01-06T12:42:06.450 回答