我写了下面的代码。为什么这个PHP函数给出了分段错误(SIGSEGV)?
<?php
function f(){
return f();
}
f();
,并得到输出
$ php test.php
Segmentation fault
为什么?我没有使用任何指针。
这是StackOverflow?
我写了下面的代码。为什么这个PHP函数给出了分段错误(SIGSEGV)?
<?php
function f(){
return f();
}
f();
,并得到输出
$ php test.php
Segmentation fault
为什么?我没有使用任何指针。
这是StackOverflow?
这是无限递归的情况,但这不是特别的原因。这是一个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的二进制文件失败了。
这不是一个无限递归吗?你想达到什么目的?
是的,这是一个无限循环。肯定PHP会报错。 – Raptor 2011-06-13 07:22:57
是的。那就对了 。但SIGSEGV只发生在C/C++代码上?不是吗? – freddiefujiwara 2011-06-13 07:23:23
PHP没有向我报告任何错误。 OS说sigsegv – freddiefujiwara 2011-06-13 07:24:07
您设置的无限递归继续添加堆栈框架,直到您超出分配给PHP进程调用堆栈的内存量,此时您将获得segmentation fault。
这来自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并开始交换,冻结/崩溃您的机器。
'f'调用'f'调用'f'调用'f'调用'f'调用'f'调用'f'调用...我也会尖叫分割故障。 – Dan 2011-06-13 07:23:42
我会尖叫“*致命错误:达到'100'的最大功能嵌套级别,正在中止!*”或“* PHP致命错误:1073741824字节允许的内存大小已用尽(尝试分配261900字节) ”。 – binaryLV 2011-06-13 07:38:38
“xdebug”是否强制限制为100? – Dan 2011-06-13 07:46:53