方案如下:
#include <stdio.h>unsigned long int add(unsigned long int n){ return (n == 0) ? 0 : n + add(n-1); }int main(){ printf("result : %lu \n",add(1000000)); return 0;}
该程序在n = 100,000时运行良好,但当n的值增加到1,000,000时,导致分段故障(core dumped)
以下是从gdb消息中获取的.
Program received signal SIGSEGV,Segmentation fault.0x00000000004004cc in add (n=Cannot access memory at address 0x7fffff7feff8) at k.c:4
我的问题:
> C中的递归深度有没有硬连线限制?还是递归深度取决于可用的堆栈内存?
>程序会收到reSIGSEGV信号的可能原因是什么?
一些实现可能有一种技术,它们可以在运行时分配新的堆栈段.但是一般来说,他们没有.
>一些函数将以稍微更不可预测的方式消耗堆栈,例如在它们分配可变长度数组时.
>某些函数可能被编译为以保留堆栈空间的方式使用尾部调用.有时你可以重写你的函数,这样所有的调用(比如自己)就像最后一件事情一样发生,希望你的编译器能够优化它.
看到每次调用函数需要多少堆栈空间并不容易,它将受制于编译器的优化级别.在你的情况下,这样做的一个便宜方式是每次打电话时都打印出来; n可能在堆栈上(特别是因为程序需要占用地址 – 否则可能在寄存器中),并且它的连续位置之间的距离将指示堆栈帧的大小.
总结以上是内存溢出为你收集整理的C中的递归深度有没有硬连线限制全部内容,希望文章能够帮你解决C中的递归深度有没有硬连线限制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)