2011-06-13 90 views
2

我写了下面的代码。为什么这个PHP函数给出了分段错误(SIGSEGV)?

<?php 
function f(){ 
    return f(); 
} 
f(); 

,并得到输出

$ php test.php 
Segmentation fault 

为什么?我没有使用任何指针。

这是StackOverflow?

+2

'f'调用'f'调用'f'调用'f'调用'f'调用'f'调用'f'调用...我也会尖叫分割故障。 – Dan 2011-06-13 07:23:42

+2

我会尖叫“*致命错误:达到'100'的最大功能嵌套级别,正在中止!*”或“* PHP致命错误:1073741824字节允许的内存大小已用尽(尝试分配261900字节) ”。 – binaryLV 2011-06-13 07:38:38

+1

“xdebug”是否强制限制为100? – Dan 2011-06-13 07:46:53

回答

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的二进制文件失败了。

2

这不是一个无限递归吗?你想达到什么目的?

+0

是的,这是一个无限循环。肯定PHP会报错。 – Raptor 2011-06-13 07:22:57

+0

是的。那就对了 。但SIGSEGV只发生在C/C++代码上?不是吗? – freddiefujiwara 2011-06-13 07:23:23

+0

PHP没有向我报告任何错误。 OS说sigsegv – freddiefujiwara 2011-06-13 07:24:07

0

您设置的无限递归继续添加堆栈框架,直到您超出分配给PHP进程调用堆栈的内存量,此时您将获得segmentation fault

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并开始交换,冻结/崩溃您的机器。

相关问题