我写了以下代码。
<?php
function f(){
return f();
}
f();
并获取输出
$ php test.php
Segmentation fault
为什么呢?我没有使用任何指针。
这是StackOverflow?
答案 0 :(得分:6)
这是一个无限递归的情况,但这不是特别的原因。这是一个stack overflow。当你有递归时,无论是否无限,你都可以根据堆栈的大小(以字节为单位)递归(添加到堆栈)的最大深度。
从技术上讲,这是无限的,但你不会在很长一段时间内得到任何错误:
<?php
function f(){
sleep(1);
return f();
}
f();
您需要的是在递归中称为base case
,以便在它消耗整个堆栈之前停止它。
<?php
function f($i){
if($i == 10)
return;
echo $i;
return f(++$i);
}
f(0);
将打印0到9。
segmentation fault
错误来自操作系统,报告PHP应用程序在添加到堆栈时遇到问题。这不会成为您的脚本,因为在系统级别,构成PHP的二进制文件失败了。
答案 1 :(得分:2)
这不是无限递归吗?你想要实现什么目标?
答案 2 :(得分:0)
您设置的无限递归会继续添加堆栈帧,直到您超出分配给PHP进程调用堆栈的内存量,此时您将获得segmentation fault。
答案 3 :(得分:0)
具体来自XDebug扩展。
运行GDB,您将看到:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff41f7e48 in xdebug_add_stack_frame (zdata=Cannot access memory at address 0x7fffff5fefa8
) at /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c:772
772 /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c: No such file or directory.
in /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c
如果禁用XDebug,它将一直执行,直到达到memory_limit
。如果您的memory_limit
太高,您可能会耗尽RAM并开始交换,冻结/崩溃您的机器。