c++栈溢出怎么解决?

报错的时候黄色箭头是指向 isLegal 方法,实在看不出来哪里错了啊还有这代码是解决 子集合问题的,用回溯法,请大神们看看那里错了?#include<iostream.h>int sum=0;int p=0;/*回溯法求解子集和数问题*/bool isLegal(int a[],bool c[],int n,int y,int k)//当前子集和是否达到标准{ sum+=a[k]; if((sum==y)&&(k<=n-1)) { for(int i=0;i<n;i++){ if(c[i]){ cout<<a[i]<<" "; } } cout<<endl; sum=0; p++; for(int h=0;h<n;h++){ c[h]=false; } return true; } else { sum-=a[k]; return false; }}bool isPart(int a[],bool c[],int n,int y,int k)//判断此元素是否可以加入子集{ sum+=a[k]; if((sum<y)&&(k<n-1)) { return true; } else { sum-=a[k]; return false; }}void partition(int A[],bool c[],int n,int y,int k){ /*回溯算法*/ while(k<n-1&&p<n-1) { if(isLegal(A,c,n,y,k)) { partition(A,c,n,y,p); break; } else if(isPart(A,c,n,y,k)) { c[k]=true; k++; partition(A,c,n,y,k); } while(c[--k]){ c[k]=false; sum-=A[k]; k--; if(k<p){break;} } while(!c[k]){ k--; if(k<p){break;} } sum-=A[k]; k++; partition(A,c,n,y,k); }}void main(){ int A[6]={10,20,30,40,50,60}; bool c[6]={0}; int k=0; for(int i=0;i<6;i++)//依次输出n个正数 cout<<A[i]<<" "; cout<<endl; partition(A,c,6,60,k);//调用函数partition() cin>>A[0];}
2026年09月23日 11:33
有2个网友回答
网友(1):

一般每个进程的栈空间是限定的。(为什么限定?去学汇编和操作系统就知道)

什么占用栈空间?
除去系统栈占用外,基本就是栈变量。(什么是栈变量?无语¥%*&……%¥%&)
简单来说上面那个a就是栈变量。

修改有两个办法:
一 改为堆变量:
int* pa = malloc(sizeof(int)*1000*1000);
然后可以将pa当数组用。(数组和指针在C里基本等同)
当然,不用了记得free pa。

二 修改系统限制
这个栈变量= 1000*1000*4 = 4M。(约等于)
如果这个函数不频繁调用,也不递归,一般还是可以接受。
可以修改操作系统对进程栈空间的大小限制,稍微调大一些。
ulimit查看系统的限制。(*nix系统命令。不是windows的)

当然方法二非常不值得推荐

网友(2):

说明递归层数过多(至少上万了)
原因是写的有问题,没设置正确的退出条件;
也有可能是就是得递归那么多层,这时可以考虑将函数递归改成利用std:stack实现递归,这样能容忍的层数会多很多,只要内存够。

丛程序是快速排序来看,更有可能是算法写错了,导致递归无法终止。