如何解决为什么此PHP函数会产生分段错误SIGSEGV?
| 我写了下面的代码。<?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并开始交换内存,从而冻结/崩溃计算机。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。