函数调用栈不够应该怎么办?
发布网友
发布时间:2022-04-22 17:56
我来回答
共5个回答
热心网友
时间:2022-04-22 19:26
调整一个C程序栈的默认大小可以使用编译选项、连接选项或使用#pragma指令,具体用法视编译器不同,VC下可以使用 /Fnewsize 编译选项设置默认栈大小,其中newsize是以字节为单位,也可以使用/STACK:reserve[,commit]连接选项,使用#pragma指令的样式如下:
#pragma comment(linker, "/STACK:reserve,commit")
reserve和commit均以字节为单位,具体查看编译器帮助文档。
如果手工模拟函数的递归调用,则有范式可供转换,一般的数据结构书上都有介绍,具体操作难度要视递归调用的复杂度而定,一般样式如下:
//将初始值压栈
while(栈非空){
//取出栈顶元素
//处理该问题
//依据处理条件将子问题分别压栈
}
也可以使用一个线程来调用,为线程指定栈大小。
如果是递归调用导致栈溢出,建议LZ考虑更好的算法,增加栈的大小不是根本办法。
热心网友
时间:2022-04-22 20:44
没有太好的办法,一般如果涉及递归调用等,不断压栈,栈就不够了
办法--编译器可以改栈大小的,默认好像是64k,但建议不要改,看看程序上怎么优化下
不好模拟
热心网友
时间:2022-04-22 22:18
有2个问题需要澄清:
1.栈是一种后进先出的数据结构,只能在末端进行插入和删除的操作。应该说成是只能在线性表的一端进行插入和删除。说成末端,就认为的把线性表分成开始端和结束端了。但由于线性表中元素只具有线性关系,并没有明确的起始元素和终止元素。
2.函数调用之所以需要栈,是因为函数执行过程中,还能会嵌套调用其他函数,但无论嵌套调用多少个函数,总是要遵循一个原则:后被调用的函数要先运行完毕,程序要回到上一层函数的调用处继续运行,为了实现这个机制,才设计了栈这种后进先出的数据结构。如果把函数调用看成罗餐盘的话,而把当你去盘子的时候,肯定先取走最后一个罗上去的盘子,那么函数运行结束,函数调用返回就相当于你在取盘子。
热心网友
时间:2022-04-23 00:10
有2个问题需要澄清:
1.栈是一种后进先出的数据结构,只能在末端进行插入和删除的操作。应该说成是只能在线性表的一端进行插入和删除。说成末端,就认为的把线性表分成开始端和结束端了。但由于线性表中元素只具有线性关系,并没有明确的起始元素和终止元素。
2.函数调用之所以需要栈,是因为函数执行过程中,还能会嵌套调用其他函数,但无论嵌套调用多少个函数,总是要遵循一个原则:后被调用的函数要先运行完毕,程序要回到上一层函数的调用处继续运行,为了实现这个机制,才设计了栈这种后进先出的数据结构。如果把函数调用看成罗餐盘的话,而把当你去盘子的时候,肯定先取走最后一个罗上去的盘子,那么函数运行结束,函数调用返回就相当于你在取盘子。
另外,站长团上有产品团购,便宜有保证
热心网友
时间:2022-04-23 02:18
堆中建立栈呗。 动态分配空间。。
不知道你有没有学过栈了。