c语言 - "程序接收信号 SIGSEGV ,分段错误" 尝试使用递归获取 3 个字符组合的所有关键字时



我正在尝试使用递归获取所有 3 个字符的关键字,但经过一些调用后,调用堆栈可能已满并且程序崩溃并出现分段错误错误,代码:

#include <cs50.h>
#include <stdio.h>
void three_Characters(char c, char c2, char c3);
int main(void){
three_Characters('A', 'A', 'A');
return 0;
}
void three_Characters(char c, char c2, char c3){
//print 3-characters 
printf("%c%c%c - ", c, c2, c3);
/*Recursion termination*/
if(c == 'z' && c2 == 'z' && c3 == 'z'){
return;
}
/*Avoid symbol characters */
if(c3 == 'Z'){
c3 += 6;
if(c2 == 'Z'){
c2 += 7;
if(c == 'Z'){
c += 7;
}
}
}
if(c3 == 'z'){
if(c2 == 'z'){
c += 1;   c2 = 65;   c3 = 64;
}else{
c2 += 1;  c3 = 64;
}
}
three_Characters(c, c2, c3 + 1); 
}

你期望你的递归有多深?

您将获得 52 个关卡,迭代"A...咱。。。z',52*52 级别迭代最后两个字符,以及 52*52*52 总递归深度。

这是一个140608深层次的递归。

每次调用例程时,都会使用一定量的堆栈。必须保存退货地址。通常还必须保存一些寄存器。

在 64 位系统上,如果不进行优化,每个递归级别可能至少使用 32 字节的堆栈。那是 4499456 字节。Linux 上的堆栈限制通常是 8MB,所以你不应该用完堆栈(而且你的程序在 64 位或 32 位模式下都不会崩溃(。但是,您将使用一半以上的可用堆栈。

您的系统可能具有较低的堆栈限制(可能为 4MB(。如果是这样,您的程序耗尽堆栈。

在 Linux(和其他 UNIX 操作系统(上,使用ulimit -s找出您当前的堆栈限制是多少,ulimit -s unlimited删除堆栈限制(这也应该允许你的程序在不点击SIGSEGV的情况下运行完成(。

附言:对这个微不足道的可迭代问题使用递归是不明智的,正是因为您将使用大量的堆栈空间。

最新更新