问题描述
|
我写了下面的代码。
<?php
function f(){
return f();
}
f();
并获得输出
$ php test.php
Segmentation fault
为什么?我没有使用任何指针。
这是StackOverflow吗?
解决方法
这是无限递归的情况,但不是特定原因。这是堆栈溢出。进行递归时,无论是否无限递归,您都可以根据堆栈的大小(以字节为单位)来递归最大深度(添加到堆栈中)。
从技术上讲,这是无限的,但相当长的一段时间您不会出现任何错误:
<?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。
“ 5”错误来自操作系统,报告PHP应用程序遇到了添加到堆栈的问题。那不会写到您的脚本中,因为在系统级,组成PHP的二进制文件已失败。
, 这不是无限递归吗?您要达到什么目标?
, 您设置的无限递归会继续添加堆栈帧,直到您超出分配给PHP流程调用堆栈的内存量为止,此时您会遇到分段错误。
, 这特别来自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被禁用,它将执行直到达到ѭ7。如果memory_limit
过高,则可能会耗尽RAM并开始交换内存,从而冻结/崩溃计算机。